Globalna promenljiva brojača u JavaScript-u
Iznosimo promenljivu num van funkcija,
čineći je time globalnom:
javascriptlet num = 1; // globalna promenljiva
function test() {
return function() {
console.log(num);
num++;
};
}
U ovom slučaju sve vraćene funkcije će menjati ovu globalnu promenljivu i brojači će raditi zavisno jedan od drugog:
javascriptlet num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // prvi brojač
func1(); // ispisaće 1
func1(); // ispisaće 2
let func2 = test(); // drugi brojač
func2(); // ispisaće 3
func2(); // ispisaće 4
Zašto je onda naš prethodni kod pravio nezavisne brojače? Podsećam na ovaj kod:
javascriptfunction test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Stvar je u tome što je promenljiva num - lokalna
unutar funkcije test. Zato svaki
poziv test stvara svoju lokalnu
promenljivu.
Stoga će vraćene funkcije referisati
svaka na svoju lokalnu promenljivu funkcije
test. Upravo se tako postiže nezavisnost
rada.
Ako se num napravi globalnom promenljivom
- to će takođe biti zatvaranje. Samo što leksička
okruženja vraćenih funkcija referišu
na istu promenljivu num - bilo kakve
promene ove promenljive videće se u
svim funkcijama.
Odredite, bez pokretanja koda, šta će se ispisati u konzolu:
javascriptlet counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Odredite, bez pokretanja koda, šta će se ispisati u konzolu:
javascriptfunction 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();
Odredite, bez pokretanja koda, šta će se ispisati u konzolu:
javascriptfunction 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();