Globálna premenná počítadla v JavaScripte
Premennú num vyberieme mimo funkcií,
čím ju urobíme globálnou:
let num = 1; // globálna premenná
function test() {
return function() {
console.log(num);
num++;
};
}
V tomto prípade budú všetky vrátené funkcie meniť túto globálnu premennú a počítadlá budú pracovať už závisle od seba:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // prvé počítadlo
func1(); // vypíše 1
func1(); // vypíše 2
let func2 = test(); // druhé počítadlo
func2(); // vypíše 3
func2(); // vypíše 4
Prečo náš predchádzajúci kód robil nezávislé počítadlá? Pripomínam tento kód:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Vec sa má tak, že premenná num je lokálna
vo vnútri funkcie test. Preto každé
volanie test vytvorí svoju vlastnú lokálnu
premennú.
Preto sa vrátené funkcie budú odkazovať
každá na svoju lokálnu premennú funkcie
test. Práve tak sa dosiahne nezávislosť
činnosti.
Ak sa num urobí globálnou premennou
- bude to tiež uzávierka. Jednoducho lexikálne
prostredia vrátených funkcií sa odkazujú
na rovnakú premennú num - akékoľvek
zmeny tejto premennej budú viditeľné vo
všetkých funkciách.
Určte, bez spustenia kódu, čo sa vypíše do konzoly:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Určte, bez spustenia kódu, čo sa vypíše do konzoly:
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();
Určte, bez spustenia kódu, čo sa vypíše do konzoly:
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();