0

Друзья, учу JavaScript и столкнулся с проблемой.

Вот код:

function makeCounter() {
  var currentCount = 1;

return function() { // (**) return currentCount++; }; }

var counter = makeCounter(); // (*)

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

// создать другой счётчик, он будет независим от первого var counter2 = makeCounter(); alert( counter2() ); // 1

Счетчик работает правильно - вызвали 3 раза - значение 3 и имеет. Но почему так происходит? Ведь в функции ему каждый раз присваивается значение 1. Следовательно при каждом вызове функции он должен выдавать 1. По крайней мере так в Си подобных языках. Предположу, что так происходит потому, что переменную один раз объявили и она стала некой глобальной и в последующих заходах в эту функцию это строка просто пропускается... В общем буду признателен за пояснение.

Sublihim
  • 2,289
Pyrejkee
  • 922
  • Раз (в общих чертах): http://ru.stackoverflow.com/questions/414092/%D0%9A%D0%B0%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%8E%D1%82-%D0%B7%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B2-javascript Два, глубже: http://ru.stackoverflow.com/questions/564433/%D0%9A%D0%B0%D0%BA%D0%B8%D0%BC-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%BC-%D0%B2-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-%D0%BC%D0%BE%D0%B6%D0%B5%D1%82-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9 – Утка Учится Укрываться Jan 15 '17 at 14:11
  • Автор, будьте внимательнее. Этот вопрос тут уже задавался, при чем точно в такой же формулировке. – Pavel Mayorov Jan 16 '17 at 06:34

1 Answers1

2

Есть хорошая статья про замыкания:

Замыкания — это функции, ссылающиеся на независимые (свободные) переменные. Другими словами, функция, определённая в замыкании, «запоминает» окружение, в котором она была создана.

В вашем случае функция makeCounter возвращает функцию, которая как бы "захватила" currentCount и, следовательно, вызывая выполнения экземпляра counter - вы инкрементируете счетчик. Создавая counter2 вы создаете новый экземпляр, который содержит в себе новый счетчик currentCount, поэтому они и выполняются независимо.

Вдобавок, есть уже ответ на ваш вопрос: Как работают замыкания в JavaScript

Sublihim
  • 2,289