Globaali laskurimuuttuja JavaScriptissä
Siirretään muuttuja num funktioiden ulkopuolelle,
tehden siitä näin globaalin:
let num = 1; // globaali muuttuja
function test() {
return function() {
console.log(num);
num++;
};
}
Tässä tapauksessa kaikki palautetut funktiot muuttavat tätä globaalia muuttujaa ja laskurit toimivat riippuvaisina toisistaan:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // ensimmäinen laskuri
func1(); // tulostaa 1
func1(); // tulostaa 2
let func2 = test(); // toinen laskuri
func2(); // tulostaa 3
func2(); // tulostaa 4
Miksi sitten edellinen koodimme loi itsenäisiä laskureita? Muistutan tästä koodista:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Asia on siinä, että muuttuja num on paikallinen
funktion test sisällä. Siksi jokainen
funktion test kutsu synnyttää oman paikallisen
muuttujansa.
Siksi palautetut funktiot viittaavat
kukin omaan funktion test paikalliseen muuttujaansa.
Näin itsenäinen toiminta saavutetaan.
Jos num tehdään globaaliksi muuttujaksi
- se on myös sulkeuma. Palautettujen funktioiden
leksikaaliset ympäristöt viittaavat
samaan muuttujaan num - kaikki
muutokset tässä muuttujassa näkyvät
kaikissa funktioissa.
Päätä, suorittamatta koodia, mitä tulostetaan konsoliin:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Päätä, suorittamatta koodia, mitä tulostetaan konsoliin:
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();
Päätä, suorittamatta koodia, mitä tulostetaan konsoliin:
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();