Globālā skaitītāja mainīgā JavaScript
Izņemsim mainīgo num ārpus funkcijām,
tādējādi padarot to par globalu:
let num = 1; // globālais mainīgais
function test() {
return function() {
console.log(num);
num++;
};
}
Šajā gadījumā visas atgrieztās funkcijas mainīs šo globalo mainīgo un skaitītāji strādās atkarīgi viens no otra:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // pirmais skaitītājs
func1(); // izvadīs 1
func1(); // izvadīs 2
let func2 = test(); // otrais skaitītājs
func2(); // izvadīs 3
func2(); // izvadīs 4
Kāpēc tad mūsu iepriekšējais kods veidoja neatkarīgus skaitītājus? Atgādināšu šo kodu:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Lieta ir tāda, ka mainīgais num - lokāls
funkcijas test iekšienē. Tāpēc katrs
test izsaukums rada savu lokālo
mainīgo.
Tāpēc atgrieztās funkcijas atsauksies
katra uz savu funkcijas test lokālo
mainīgo. Tieši tā tiek panākta neatkarīga
darbība.
Ja padara num par globalu mainīgo
- tas arī būs aizvērums. Vienkārši leksiskās
vides atgrieztajām funkcijām atsaucas
uz vienu un to pašu mainīgo num - jebkādas
izmaiņas šajā mainīgajā būs redzamas visās
funkcijās.
Noteikt, nepalaist kodu, kas tiks izvadīts 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();
Noteikt, nepalaist kodu, kas tiks izvadīts 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();
Noteikt, nepalaist kodu, kas tiks izvadīts 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();