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



Чат с GPT Компилятор