让我们说我们已经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)
最后得到的功能是什么?
本质上不是counter1和createCounter指向全局范围内的内部函数的指针?
也许更好的方式来问这是为什么counter1()工作而不仅仅是返回内部函数createCounter呢?
不,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)