Всегда ли замыкание должно быть во IIFE? - PullRequest
1 голос
/ 17 мая 2019

Любая функция внутри функции образует замыкание. Всегда ли замыкания должны быть в немедленно вызванной функции?

Первый пример, когда замыкание формируется в iife и работает как положено, выдает «8» и «7» в качестве вывода.

var cat = (function (){
  var lives = 9;
  return function() {
    return --lives;
  }
}());
console.log("iife");
console.log(cat());
console.log(cat());

В приведенном ниже примере замыкание не работает должным образом, каждый раз печатает одно и то же значение.

var cat = function (){
  var lives = 9;
  return function() {
    return --lives;
  }
};

console.log("no iife");
console.log(cat()());
console.log(cat()());

1 Ответ

2 голосов
/ 17 мая 2019

Закрытие - это просто ссылка между функцией и областью, в которой она была создана, ссылка, которая существует, когда функция использует переменную из этой области.

У вас есть эта проблема, потому что вы не сохраняетезакрытие: вы воссоздаете его каждый console.log, когда вы звоните cat().

Измените

console.log(cat()());
console.log(cat()());

на

let c = cat();
console.log(c());
console.log(c());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...