Глабальная зменная лічыльніка ў JavaScript
Вынясем зменную num за функцыі,
тым самым зрабіўшы яе глабальнай:
let num = 1; // глабальная зменная
function test() {
return function() {
console.log(num);
num++;
};
}
У гэтым выпадку ўсе якія вяртаюцца функцыі будуць змяняць гэтую глабальную зменную і лічыльнікі будуць працаваць ужо залежна адзін ад аднаго:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // першы лічыльнік
func1(); // вывядзе 1
func1(); // вывядзе 2
let func2 = test(); // другі лічыльнік
func2(); // вывядзе 3
func2(); // вывядзе 4
Чаму ж наш папярэдні код рабіў незалежныя лічыльнікі? Нагадаю гэты код:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Справа ў тым, што зменная num - лакальная
ўнутры функцыі test. Таму кожны
выклік test нараджае сваю лакальную
зменную.
Таму якія вяртаюцца функцыі будуць спасылацца
кожная на сваю лакальную зменную функцыі
test. Менавіта так і дасягаецца незалежнасць
працы.
Калі ж зрабіць num глабальнай зменнай
- гэта таксама будзе замыканнем. Проста лексічныя
асяроддзі якія вяртаюцца функцый спасылаюцца
на адну і тую ж зменную num - любыя
змены з гэтай зменнай будуць бачныя ва ўсіх
функцыях.
Вызначыце, не запускаючы код, што вывядзецца ў кансоль:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Вызначыце, не запускаючы код, што вывядзецца ў кансоль:
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();
Вызначыте, не запускаючы код, што вывядзецца ў кансоль:
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();