最后一段javascript闭包我不明白

Ant*_*tiz 5 javascript

让我们说我们已经function在全球范围内定义了这个:

function createCounter() {
  var counter = 0;

  function increment() {
    counter = counter + 1;

    console.log("Number of events: " + counter);
  }

  return increment;
}
Run Code Online (Sandbox Code Playgroud)

在解释闭包的大多数示例中,我看到执行:

createCounter();
Run Code Online (Sandbox Code Playgroud)

从全局范围将只返回内部函数:

function increment() {
    counter = counter + 1;

    console.log("Number of events: " + counter);
}
Run Code Online (Sandbox Code Playgroud)

现在这完全有道理,因为createCounter函数声明中的这一行

return increment;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,为什么这样:

var counter1 = createCounter();

counter1();

Number of events: 1 //result
Run Code Online (Sandbox Code Playgroud)

最后得到的功能是什么?

本质上不是counter1createCounter指向全局范围内的内部函数的指针?

也许更好的方式来问这是为什么counter1()工作而不仅仅是返回内部函数createCounter呢?

Jua*_*des 3

不,createCounter是一个返回函数的单独实例的函数,该increment函数持有带有不同局部counter变量的新闭包。

所以是的,您需要额外的调用来获取该函数的单独实例,并根据需要多次调用它。请注意,调用 createCounter 不会增加计数器,但调用 counter1 或 counter2 会增加计数器。

var counter1 = createCounter(); //local counter is still 0
var counter2 = createCounter();
counter1(); // 1
counter2(); // 1
counter1(); // 2
counter2(); // 2
Run Code Online (Sandbox Code Playgroud)