Задать вопрос
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;}
})();

То эта гребанная фигня выполняет чек, почему тогда каунтер не обнуляется постоянно? Что это за неведомый ужас? Как это вообще работает?
  • Вопрос задан
  • 767 просмотров
Подписаться 5 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Решения вопроса 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 уже будет определено.
Ответ написан
Ваш ответ на вопрос

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

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