我正在阅读this resource试图了解Javascript中闭包是如何工作的。
我理解每次在正常词法范围之外调用函数时,它会创建闭包,能够访问封闭的函数变量并使用它们来存储状态。
这适用于下面的my_module.incrCounter();
(不断增加计数器),但为什么它在my_module.incrLocalCounter();
中不起作用,每次都返回1?
incrLocalCounter
内的IIFE不应该在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
}
})();
答案 0 :(得分:0)
您的“嵌套”IIFE每次都会记录1,因为在IIFE运行之前,递增的变量始终初始化为0。也就是说,在嵌套函数内部,local_counter
始终从0开始。
如果您将var
的{{1}}声明移到local_counter
之外,那么您会看到它递增。或者,您可以让incrLocalCounter()
返回函数并将其作为您返回的属性值:
incrLocalCounter()
答案 1 :(得分:0)
incrLocalCounter
内的IIFE不应该在local_counter
上创建闭包吗?
确实如此。 local_counter
当时0
。然后通过执行IIFE将其从0
增加到1
。然后它返回1
。每次调用local_counter
时,它都会执行相同的序列(包括设置0
到incrLocalCounter
)。区别不在于incrLocalCounter
有IIFE;不同之处在于是否在函数内重置正在递增的变量。