evgeniy8705
@evgeniy8705
Повелитель вселенной

Как понять момент в замыкании(JS)?

Есть пример в учебнике. не могу понять почему решение срабатывает, только если к функции makeCounter обратиться через переменную counter ( var counter = makeCounter(); ).
Если не создавать переменную, и писать console.log( makeCounter() () );, то ничего не работает.

Для чего функцию помещают в переменную?

function makeCounter() {
	var currentCount = 0;

	return function() {
		currentCount++;
		return currentCount;
	};
}

var counter = makeCounter();

console.log( counter() );
console.log( counter() );
console.log( counter() );
console.log( counter() );
console.log( counter() );
console.log( counter() );
console.log( counter() );
console.log( counter() );
  • Вопрос задан
  • 2902 просмотра
Решения вопроса 1
dunmaksim
@dunmaksim
Технический писатель
Переписал код, надеюсь, более понятно стало:
function makeCounter(){
    //Эта переменная видна только здесь
    var currentCount = 0;
    
    //Эта функция - тоже только здесь, зато она видит currentCount
    function getCountValue(){
        currentCount += 1;
        return currentCount;
    }
    
    //Возвращаем саму функцию, а не её значение
    return getCountValue;
}

//counter = getCountValue
var counter = makeCounter();

counter(); //На самом деле - вызов getCountValue()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@vsvladimir
makeCounter() возвращает функцию - счетчик, которая при каждом вызове будет выдавать на 1 большее значение. И makeCounter для каждого вызова себя хранит текущее значение счетчика в переменной currentCount.

Можно сделать несколько независимых счетчиков:
var counter1 = makeCounter();
var counter2 = makeCounter();

makeCounter()() - создаст счетчик и запустит его 1 раз (результат 1).
Если еще раз запустить makeCounter()() - появится новый счетчик (результат 1).
Переменная counter нужна, чтобы запомнить тот самый счетчик, а не создавать каждый раз новый.
Ответ написан
Комментировать
abler98
@abler98
Software Engineer
В примере сначала идет присвоение переменной функции makeCounter (об этом даже название функции говорит), которая в свою очередь возвращает другую функцию, в результате переменная counter = function() {
currentCount++;
return currentCount;
}; Которую мы потом вызываем
Ответ написан
@WhoMe
Уже разобрались?
Всё работает.
Вызов makeCounter() каждый раз создает новую currentCount и возвращает новую функцию.
console.log( makeCounter() () );
console.log( makeCounter() () );

Будет примерно эквивалентно
var counter1 = makeCounter();
var counter2 = makeCounter();
console.log(  counter1() );
console.log( counter2() );
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы