Замыкания и вызов функции на месте в JavaScript

Как вы уже знаете, можно вызвать анонимную функцию на месте и присвоить результат работы какой-либо переменной:

let result = function() { return '!'; }(); alert(result); // выведет '!'

Часто функцию, вызывающуюся на месте, в таком случае берут в круглые скобки, хотя в этом и нет нужды. Это делается для того, чтобы сразу было видно, что функция вызывается на месте:

let result = (function() { return '!'; })(); alert(result); // выведет '!'

Пусть теперь результатом вызванной на месте функции будет анонимная функция:

let func = (function() { return function() { alert('!'); } })(); func(); // выведет '!'

Давайте сделаем так, чтобы возвращаемая функция хранила в замыкании переменную num:

let func = (function() { let num = 1; return function() { alert(num); } })();

Если добавить еще num++, то функция func станет готовым счетчиком:

let func = (function() { let num = 1; return function() { alert(num); num++; } })(); func(); //выведет 1 func(); //выведет 2 func(); //выведет 3 func(); //выведет 4 func(); //выведет 5

Не подсматривая в мой код, самостоятельно реализуйте такой же счетчик.

Модифицируйте работу счетчика так, чтобы он считал до 5, а потом отсчет начинался сначала.

Сравнение с предыдущим способом

Давайте сравним наш счетчик со счетчиком на замыканиях, который мы делали ранее:

function test() { let num = 1; return function() { alert(num); num++; } } let func = test(); func(); //выведет 1 func(); //выведет 2 func(); //выведет 3 func(); //выведет 4 func(); //выведет 5

Как вы видите, наш новый способ проще: в переменную сразу попадает готовый счетчик, в отличие от старого способа, в котором у нас появляется дополнительная функция test. Кроме того, в старом способе можно создать несколько счетчиков:

function test() { let num = 1; return function() { alert(num); num++; }; }; let func1 = test(); // первый счетчик func1(); //выведет 1 func1(); //выведет 2 let func2 = test(); // второй счетчик func2(); //выведет 1 func2(); //выведет 2

В новом способе получится только один уникальный счетчик. Если вам действительно нужен только один счетчик, то удобно использовать новый способ: так вы обезопасите себя от случайного создания нескольких счетчиков.