是否总是需要在IIFE中关闭?

时间:2019-05-17 10:39:46

标签: javascript closures

函数内的任何函数均构成闭包。 闭包是否始终需要包含在立即调用的函数中?

第一个示例是在一个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 个答案:

答案 0 :(得分:2)

闭包只是函数与创建它的作用域之间的链接,当函数使用该作用域中的变量时,该链接就存在。

存在此问题是因为您没有保留闭包:您在调用console.log时每cat()处都会重新创建它。

更改

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

进入

let c = cat();
console.log(c());
console.log(c());