Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]zasięg zmiennej
Forum PHP.pl > Forum > Przedszkole
porzeczki
przedszkole to przedszkole
  1. function foo() {
  2. var num = 42;
  3. bar = function() { num++; }
  4. gLogNumber = function() { console.log(num); }
  5. setN = function(x) { num = x; }
  6. }
  7.  
  8. foo();
  9. bar();
  10. gLogNumber();// 43


w foo definiuję lokalną zmienną a w bar inkrementuję globalną. Uczyli mnie że zmienne globalne i lokalne o tej samej nazwie to 2 różne zmienne.
by_ikar
Kiedy używasz var/let/const to tworzysz nową zmienną w danym scope (let/const nawet w bloku). Kiedy deklarujesz zmienną i nie używasz do tego var/let/const wtedy twoja zmienna tworzy się w global scope, to znaczy przypisuje się do window.

Więc mógłbyś zrobić tak:

  1. function foo() {
  2. var num = 42;
  3. bar = function() { num++; }
  4. gLogNumber = function() { console.log(num); }
  5. setN = function(x) { num = x; }
  6. }
  7.  
  8. foo();
  9. window.bar();
  10. window.gLogNumber();// 43


Co zrobić żeby do takiej sytuacji nie dopuścić? Używać strict mode:

  1. 'use strict';
  2.  
  3. function foo() {
  4. var num = 42;
  5. bar = function() { num++; }
  6. gLogNumber = function() { console.log(num); }
  7. setN = function(x) { num = x; }
  8. }
  9.  
  10. foo()
  11.  
  12. Uncaught ReferenceError: bar is not defined
  13. at foo (<anonymous>:4:7)
  14. at <anonymous>:1:1


Tutaj więcej informacji o strict mode: https://developer.mozilla.org/en-US/docs/We...nce/Strict_mode
porzeczki
(odpowiadam sam sobie. Może tu kiedyś wrócę.)


//jeśli zdefiniowałeś globalną zmienną to lokalnie w funkcji użycie nazwy tej zmiennej (bez window.)
odnosi się do niej ALE jeśli w tej lokalnej funkcji zdefiniowałem lokalną zmienną o tej samej nazwie
to ona PRZYSŁANIA globalną i dostęp do globalnej musze poprzedzić przedrostkiem window..


  1. var global_ten=10;
  2. function foo() {
  3. var global_ten = 42;
  4. bar = function() {
  5. global_ten++;
  6. console.log(window.global_ten);
  7. console.log(global_ten); }
  8. }
  9. foo();
  10. bar(); // 10, 43
  11. -----------------------------
  12. var global_ten=10;
  13. function foo() {
  14. bar = function() {
  15. global_ten++;
  16. console.log(window.global_ten);
  17. console.log(global_ten); }
  18. }
  19. foo();
  20. bar(); // 11, 11
by_ikar
Tak na przyszłość, używaj strict mode, żeby nie odciąć się od tego jak kiedyś JS działał, a jak działa teraz. Przykładowo w tym twoim ostatnim poście, nigdzie nie masz deklaracji bar i już by był błąd. Uważam że takie rzeczy trzeba wiedzieć od samego początku, dlatego że już na początku przestanie wprowadzać to niepotrzebne zamieszanie oraz nie pozwoli ci uczyć się złych nawyków.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.