Pasaulinė skaitiklio kintamoji JavaScript
Iškelkime kintamąjį num už funkcijų ribų,
taip padarydami jį pasauliniu:
let num = 1; // pasaulinis kintamasis
function test() {
return function() {
console.log(num);
num++;
};
}
Šiuo atveju visos grąžinamos funkcijos keis šį pasaulini kintamąjį ir skaitikliai veiks priklausomai vienas nuo kito:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // pirmas skaitiklis
func1(); // išves 1
func1(); // išves 2
let func2 = test(); // antras skaitiklis
func2(); // išves 3
func2(); // išves 4
Kodėl mūsų ankstesnis kodas darė nepriklausomus skaitiklius? Priminsiu šį kodą:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Reikalas tas, kad kintamasis num yra lokalus
funkcijos test viduje. Todėl kiekvienas
test iškvietimas sukuria savo lokalų
kintamąjį.
Todėl grąžinamos funkcijos nuorodos
kiekviena į savo funkcijos test lokalų
kintamąjį. Būtent taip ir pasiekiamas nepriklausomumas
veikimo.
Jei padarytume num pasauliniu kintamuoju
- tai taip pat bus uždaroji funkcija. Tiesiog leksinės
grąžinamų funkcijų aplinkos nuoroda
į tą patį kintamąjį num - bet kokie
pakeitimai su šiuo kintamuoju bus matomi
visose funkcijose.
Nustatykite, nepaleisdami kodo, kas bus išvesta į konsolę:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Nustatykite, nepaleisdami kodo, kas bus išvesta į konsolę:
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();
Nustatykite, nepaleisdami kodo, kas bus išvesta į konsolę:
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();