为什么嵌套的IIFE不创建闭包?
我正在阅读这个资源,试图了解在Javascript中闭包是如何工作的。
我明白,每当函数被调用超出其正常的词法范围时,它就会创建闭包,能够访问封闭函数变量并使用它们来存储状态。
这适用于my_module.incrCounter();
下面(它不断增加计数器),但为什么它不能在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; 不同之处在于变量是否在函数中被重置。