Задать вопрос
Stasgar
@Stasgar
Обученная макака

Как работают замкнутые функции?

var add = (function () {
    var counter = 0;
    return function () {return counter += 1}
})();

add();
add();
add();

Какой алгоритм выполнения? По шагам. Почему такое не работает:

var add = (function () {
    var counter = 0;
    return function () {return counter += 1; alert("s")}
})();

add();
add();
add();

Почему не срабатывает alert? Ведь каунтер увеличивается. У меня уже крыша едет...
И каким образом вообще это должно работать? Почему counter=0 делается только один раз, но при этом если написать так:
var add = (function () {
    var counter = 0;
	alert("check");
    return function () {return counter += 1;}
})();

То эта гребанная фигня выполняет чек, почему тогда каунтер не обнуляется постоянно? Что это за неведомый ужас? Как это вообще работает?
  • Вопрос задан
  • 764 просмотра
Подписаться 5 Оценить Комментировать
Решения вопроса 1
alsopub
@alsopub
Почему такое не работает

Вполне работает - codepen.io/anon/pen/VagRNa?editors=1111
Вы просто никуда результат не выводите.

Почему не срабатывает alert

Он находится вне вызываемой функции и вызывается один раз, когда создается замыкание.
При помощи add() вы вызываете только функцию function () {return counter += 1;} без alert.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Subotinn
@Subotinn
При первом вызове этой строчки кода:
return function () {return counter += 1}
Js не найдет переменной counter в данной функции. После этого Js перейдет на 1 уровень вверх, чтобы поискать, не объявлена ли переменная counter выше. Переменная counter будет найдена и ее значение будет равно 0.
Стоит учесть что при выполнении этой функции, все переменные использованные в ее теле - сохраняются, то есть при последующих вызовах внутренней функции значение counter уже будет определено.
Ответ написан
Ваш ответ на вопрос

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

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