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 = )?
  • Вопрос задан
  • 1162 просмотра
Решения вопроса 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", если его сбросить, счётчик тоже сбросится.

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

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

Войти через центр авторизации
Похожие вопросы
17 апр. 2024, в 00:48
35000 руб./за проект
17 апр. 2024, в 00:13
800 руб./за проект
17 апр. 2024, в 00:06
240000 руб./за проект