Замыкание в JavaScript [дубликат]

349
16 января 2017, 22:13

На данный вопрос уже ответили:

  • Как работают замыкания в JavaScript 5 ответов
  • Принцип работы вложенных функций или “непонятное замыкание” в JavaScript 2 ответа
  • Возврат функции из функции - как работает замыкание? 3 ответа

Друзья, учу 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. По крайней мере так в Си подобных языках. Предположу, что так происходит потому, что переменную один раз объявили и она стала некой глобальной и в последующих заходах в эту функцию это строка просто пропускается... В общем буду признателен за пояснение.

Answer 1

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

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

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

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

READ ALSO
Как можно упростить этот код JavaScript?

Как можно упростить этот код JavaScript?

Код неплохой, но единственное, что я сделал бы:

314
(Mongoose) В чем причина ошибки: “Hex is not a function?”

(Mongoose) В чем причина ошибки: “Hex is not a function?”

При вызове ObjectId выдает ошибку: Type error: hex is not a function

353
Автоскролл к фокусируемому елементу js and react

Автоскролл к фокусируемому елементу js and react

Здравствуйте, есть проблемка, нужно сделать автоподскрол елемента на центр когда он в фокусе, то есть идет до центра а дальше стоит там до самого...

324