@Stpnki

Почему идет обращение сразу к вложенной функции и игнорируется внешняя?

Я читаю учебник (https://learn.javascript.ru/closure), и не могу никак взять в толк, почему так. Такой пример:
function makeCounter() {
  let count = 0;

  return function() {
    return count++; // есть доступ к внешней переменной "count"
  };
}

let counter = makeCounter();

alert( counter() ); // 0
alert( counter() ); // 1
alert( counter() ); // 2


1. Почему присваиваем переменной функцию, а если так не сделать, и просто поместить в alert саму функцию, выводит просто её содержимое в текстовом виде:
alert(makeCounter());

Результат:
function () {
    return count++; // есть доступ к внешней переменной "count"
  }

2. Почему в следующих итерациях count увеличивается на 1. Хотя, функция makeCounter должна вызываться как бы заново, и присваивать переменной count = 0. И только на следующем шаге увеличивать на 1. Я пробовал запускать через визуализатор и получается, что переменной count присваивается 0 только один раз, а все остальные вызовы идет обращение сразу к вложенной функции, соответственно, переменная остается такой же, как и в предыдущей итерации, не обнуляется.
Про область видимости читал).

В общем, мне по большей части не понятно, почему идет обращение сразу к вложенной функции и игнорируется внешняя, где переменной count присваивается 0.
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 3
yarkov
@yarkov Куратор тега JavaScript
Помог ответ? Отметь решением.
Про область видимости читал)

Видимо не дочитал))
Вызов makeCounter() возвращает анонимную функцию, которая в дальнейшем и вызывается. Соответственно переменная count инициализируется однажды и дальше доступна внутри анонимной функции.
Ответ написан
@ClayRing

Почему присваиваем переменной функцию, а если так не сделать, и просто поместить в alert саму функцию, выводит просто её содержимое в текстовом виде:


В первом примере вы выводите результат работы функции `counter()` (это число). Во втором примере вы выводите результат работы функции `makeCounter()` (это функция `counter()`).

Попробуйте сделать так:
`alert(makeCounter()())`
И посмотреть на содержимое. Думаю станет понятнее.


Почему в следующих итерациях count увеличивается на 1. Хотя, функция makeCounter должна вызываться как бы заново, и присваивать переменной count = 0.

С чего это она должна вызываться заново? Вы вызываете `makeCounter()` только один раз, а далее на каждой итерации вызываете только `counter()`.
Ответ написан
@ArturHabr
почему идет обращение сразу к вложенной функции и игнорируется внешняя,
.
Не сразу.
let counter = makeCounter(); - Здесь в переменную counter присваивается результат вызова makeCounter() и результатом будет возвращённая функция:
return function() {
return count++; // есть доступ к внешней переменной "count"
};

Далее мы вызываем собственно counter() (не забываем, что у него в теле лежит увеличение счётчика).
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы