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