[英]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.