Я не могу понять пример закрытия - PullRequest
0 голосов
/ 30 мая 2018

Пожалуйста, я понимаю, что замыкания.Почему счетчик работает в первом варианте, а во втором - нет?

var counter = (function(){
    var count=0;
    return function(){
       return count++;
    }
}());

console.log(counter());
console.log(counter());
console.log(counter());

Счетчик выводит 0,1,2

var counter = function(){
  var count=0;
  return function(){
     return count++;
  }
};

console.log(counter()());
console.log(counter()());
console.log(counter()());

Счетчик выводит 0,0,0

В чем разница?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

В первом примере счетчику присваивается возвращаемое значение функции, вызывающей себя.

counter =(

В первом примере вызывается счетчик, и он возвращает

return count++;.

Во втором примере счетчик является обычной функцией, и при вызове начинается с объявления

var count=0;
0 голосов
/ 30 мая 2018

В первом примере используется выражение функции Immediately Inovked .Это вызов встроенной функции и назначение результирующей функции для счетчика.Каждый раз, когда вы вызываете counter (), вы вызываете ту внутреннюю функцию, которая имеет переменную count в области видимости.

Второй пример эквивалентен записи в виде

function counter() {
  var count=0;
  return function(){
     return count++;
  }
}

Когда вы пишете это таким образом, становится понятнее, что каждый раз, когда вы вызываете counter (), вы возвращаете new *Функция 1009 * с переменной count в области действия

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

var counter = function(){
  var count=0;
  return function(){
     return count++;
  }
};

var counterObj = counter();

counterObj(); // returns 0
counterObj(); // returns 1
counterObj(); // returns 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...