[英]Final piece of javascript closures I stil don't understand
假设我们已在全局范围内定义了此function
:
function createCounter() {
var counter = 0;
function increment() {
counter = counter + 1;
console.log("Number of events: " + counter);
}
return increment;
}
在解释闭包的大多数示例中,我看到执行:
createCounter();
从全局范围将只返回内部函数:
function increment() {
counter = counter + 1;
console.log("Number of events: " + counter);
}
现在这完全有道理,因为createCounter
函数声明中的这一行
return increment;
所以我的问题是,为什么这样:
var counter1 = createCounter();
counter1();
Number of events: 1 //result
最后得到的功能是什么?
本质上不是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
createCounter()
返回函数而不调用它。
您可以执行createCounter()()
来调用它,而无需中间变量。
如果你在外部函数中也有控制台输出,就像这样,它会更清楚发生了什么:
function createCounter() {
console.log("in createCounter");
var counter = 0;
function increment() {
counter = counter + 1;
console.log("Number of events: " + counter);
}
return increment;
}
当您调用createCounter()
并将结果保存在变量中时,您将获得输出“in createCounter”但不是“事件数”。 当您调用存储在变量中的函数时,您会得到“事件数:1”但不是“在createCounter中”。
Function
类型的objects
。 createCounter
在全局范围内,但increment
不在。 当你调用createCounter()时,它返回一个存在于'createCounter function scope and there is another variable
的函数,并且该function scope and there is another variable
counter`。
因此,当您调用返回的函数时,您将counter1
命名为counter1
counter1()
,然后调用它,然后递增计数器并记录结果。
如果你做console.log(counter1)
它将打印该函数,因为它只是函数指针。
当执行counter1()
,您正在调用函数本身
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.