我无法理解闭包的例子

时间:2018-05-30 18:14:03

标签: javascript closures

请理解关闭。 为什么计数器在第一个版本中工作,但在第二个版本中没有?

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 :(得分:1)

在第一个示例中,您使用的是Immediately Inovked Function Expression。这是调用内联函数并将结果函数分配给计数器。每次调用counter()时,都会调用内部函数,该函数在范围内具有count变量。

第二个例子相当于写作

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

当你用这种方式编写时,每次调用counter()时,你都会返回一个 new 函数,并在范围内使用count变量

您可以在第二个示例中执行等效操作,方法是将结果分配给变量并多次调用。

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

var counterObj = counter();

counterObj(); // returns 0
counterObj(); // returns 1
counterObj(); // returns 2

答案 1 :(得分:-1)

在第一个示例中,为计数器分配了自调用函数的返回值。

counter =(

在第一个例子中,调用counter并返回

return count++;.

在第二个例子中,counter是一个常规函数,当从声明

开始调用时
var count=0;