Globalna zmienna licznika w JavaScript
Wynieśmy zmienną num poza funkcje,
tym samym czyniąc ją globalną:
let num = 1; // zmienna globalna
function test() {
return function() {
console.log(num);
num++;
};
}
W tym przypadku wszystkie zwracane funkcje będą modyfikować tę globalną zmienną i liczniki będą już działać zależnie od siebie:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // pierwszy licznik
func1(); // wypisze 1
func1(); // wypisze 2
let func2 = test(); // drugi licznik
func2(); // wypisze 3
func2(); // wypisze 4
Dlaczego więc nasz poprzedni kod tworzył niezależne liczniki? Przypomnę ten kod:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Chodzi o to, że zmienna num jest lokalna
wewnątrz funkcji test. Dlatego każde
wywołanie test tworzy swoją własną zmienną lokalną.
Dlatego zwracane funkcje będą odnosić się
każda do swojej lokalnej zmiennej funkcji
test. W ten sposób osiąga się niezależność
działania.
Jeśli natomiast uczynimy num zmienną globalną
- to również będzie domknięciem. Po prostu otoczenia leksykalne
zwracanych funkcji odnoszą się
do tej samej zmiennej num - jakiekolwiek
zmiany tej zmiennej będą widoczne we
wszystkich funkcjach.
Określ, bez uruchamiania kodu, co zostanie wypisane w konsoli:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Określ, bez uruchamiania kodu, co zostanie wypisane w konsoli:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test()();
let func1 = func;
let func2 = func;
func1();
func2();
func1();
func2();
Określ, bez uruchamiania kodu, co zostanie wypisane w konsoli:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test();
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();