Задать вопрос
heretic_man
@heretic_man

Почему при запуске функции-замыкания, переменная внутри не затирается?

Вот код замыкания, суть я понял - Функция создаёт объект который будет содержать все локальные переменные. И любые функции которые мы определяем внутри будут иметь ссылку на этот объект. Если их нет (вложенных функций) то и нет смысла хранить эти ссылки.

function makeCounter() {
  var count = 1;

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

var counter = makeCounter();

// каждый вызов увеличивает счётчик и возвращает результат
alert( counter() ); // 1
alert( counter() ); // 2
alert( counter() ); // 3


Вопрос - почему при каждом вызове счётчика объект с ссылками не перезаписыватся когда встречается инициализация переменной count (var count = )?
  • Вопрос задан
  • 1167 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
coderisimo
@coderisimo Куратор тега JavaScript
Ф-ция makeCounter вызывается ОДИН раз. Соответственно ЕДИНОЖДЫ объявляется и инициализируется единицей переменная count . Данная переменная является частью области видимости созданной при вызове makeCounter. Данная функция возвращает другую функцию (назовем ее f для удобства)

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


которая так же имеет доступ к этой области видимости в которой была определена переменная count. Вот и все. Далее вы вызываете эту функцию (f) много раз и каждый раз она работает все с той же переменной count.

Попробуйте сделать вот так :

var counter = makeCounter(); //   присвоили функцию у которой своя  СОБСТВЕННАЯ область видимости 
var counter2 = makeCounter(); //   присвоили функцию у которой своя  СОБСТВЕННАЯ отличная от предыдущей область видимости


появится две области видимости и у каждой будет свой отдельный count.
попробуйте повызывать

console.log( counter());
console.log( counter2());
Ответ написан
Комментировать
@i1yas
Потому что вызов функции makeCounter сохранен в переменную counter, которая уже потом многократно вызывается.
Перезапись переменной count была если бы функцию вызывали так
makeCounter()()
makeCounter()()
makeCounter()()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
MDiMaI666
@MDiMaI666
Талантливый программист
Потому что вы сохранили его в переменную "counter", если его сбросить, счётчик тоже сбросится.

А вызывая его как метод просто вызываете грубо говоря функцию внутри него.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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