[英]Why a nested IIFE is not creating closure?
我正在閱讀此資源,試圖了解閉包在 Javascript 中的工作原理。
我知道每次在正常詞法范圍之外調用函數時,它都會創建閉包,從而能夠訪問封閉的函數變量並使用它們來存儲狀態。
這適用於my_module.incrCounter();
下面(它不斷增加計數器),但為什么它在my_module.incrLocalCounter();
不起作用my_module.incrLocalCounter();
,哪個每次都返回 1?
如果不是里面的IIFE incrLocalCounter
創建關閉了local_counter
?
var my_module = (function tlModule(){
var counter = 0;
function incrCounter(){
counter++
console.log(counter);
};
function incrLocalCounter(){
var local_counter = 0;
(function () {
local_counter++
console.log(local_counter)
})();
};
return {
incrCounter: incrCounter,
incrLocalCounter: incrLocalCounter
}
})();
您的“嵌套”IIFE 每次都記錄 1,因為在 IIFE 運行之前,遞增的變量始終初始化為 0。 也就是說,在嵌套函數中, local_counter
總是從 0 開始。
如果您將local_counter
的var
聲明local_counter
incrLocalCounter()
之外,那么您將看到它增加。 或者,您可以讓incrLocalCounter()
返回一個函數,並將其作為您返回的屬性值:
function incrLocalCounter(){
var local_counter = 0;
return function () {
local_counter++
console.log(local_counter)
};
};
return {
incrCounter: incrCounter,
incrLocalCounter: incrLocalCounter() // <-- call the function
}
如果不是里面的IIFE
incrLocalCounter
創建關閉了local_counter
?
確實如此。 local_counter
為0
。 然后它通過執行 IIFE 將它從0
增加到1
。 然后它返回1
。 每次調用incrLocalCounter
時,它都會執行相同的序列(包括將local_counter
設置為0
)。 區別不在於incrLocalCounter
有一個 IIFE; 區別在於被遞增的變量是否在函數內被重置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.