@CoyoteSS

Почему счётчик не сбрасывается в JS?

В learnjs нашёл странную задачку, в которой код работает как-то очень непонятно, объясните.
Ведь с логической точки зрения при каждом вызове функции makeCounter(), которую мы присвоили во внешнюю переменную counter, у нас при выполнении сначала должен сброситься счётчик counter.currentCount в единицу! И только потом выполниться внутренняя функция counter() и результат следовательно всегда должен возвращаться как 1, 1, 1, 1, 1... (т.к. инкремент постфиксный возвращает старое значение)
function makeCounter() {
  function counter() {
    return counter.currentCount++;
  };
  counter.currentCount = 1;

  return counter;
}

var counter = makeCounter();
alert( counter() ); // 1
alert( counter() ); // 2
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
yarkov
@yarkov Куратор тега JavaScript
Помог ответ? Отметь решением.
Ведь с логической точки зрения при каждом вызове функции makeCounter(), которую мы присвоили во внешнюю переменную counter, у нас при выполнении сначала должен сброситься счётчик counter.currentCount в единицу!

Ничего подобного. Строчка counter.currentCount = 1; выполнится один раз, при вызове makeCounter(). В дальнейшем будет вызываться функция counter, которая инкрементирует переменную.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
rockon404
@rockon404
Frontend Developer
И только потом выполниться внутренняя функция counter()

При вызове makeCounter() функция counter не выполняется. Вызов makeCounter() ее возвращает.

Замыкания: Возврат функции
Ответ написан
Stalker_RED
@Stalker_RED
Вот все то-же самое, только названия переменных поменял
function создать() {
  function возвращаемаяФункция() {
    return возвращаемаяФункция.свойство++;
  };
  возвращаемаяФункция.свойство = 1; // эта строка выполняется только при вызове "создать"

  return возвращаемаяФункция;
}

var созданнаяФункция = создать();

alert( созданнаяФункция() ); // 1
alert( созданнаяФункция() ); // 2

https://jsfiddle.net/rebm120p/

Антон Спирин все правильно сказал: читайте внимательнее главу.
https://learn.javascript.ru/closures#vozvrat-funktsii

Вы запускаете makeCounter один раз, и только один раз значение счетчика устанавливается в единицу.

https://jsfiddle.net/rebm120p/1/
Ответ написан
Ваш ответ на вопрос

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

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