Глобальная переменная счетчика в 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();