Javascript 为什么嵌套的IIFE不创建闭包?
我正在阅读,试图理解闭包在Javascript中是如何工作的 我知道,每次在函数的正常词法范围外调用函数时,它都会创建闭包,能够访问封闭的函数变量并使用它们存储状态 这在Javascript 为什么嵌套的IIFE不创建闭包?,javascript,Javascript,我正在阅读,试图理解闭包在Javascript中是如何工作的 我知道,每次在函数的正常词法范围外调用函数时,它都会创建闭包,能够访问封闭的函数变量并使用它们存储状态 这在my_module.incrCounter()中起作用(它不断增加计数器),但为什么它在my_module.incrLocalCounter()中不起作用,每次都返回1 本地计数器中的iLife不应该在本地计数器上创建闭包吗 var my_module = (function tlModule(){ var counter
my_module.incrCounter()中起作用下面是code>(它不断增加计数器),但为什么它在my_module.incrLocalCounter()中不起作用代码>,每次都返回1
本地计数器中的iLife不应该在本地计数器上创建闭包吗
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\u计数器的var
声明移动到外部incrLocalCounter()
,则会看到它递增。或者,您可以让incrLocalCounter()
返回一个函数,并将其作为您返回的属性值:
function incrLocalCounter(){
var local_counter = 0;
return function () {
local_counter++
console.log(local_counter)
};
};
return {
incrCounter: incrCounter,
incrLocalCounter: incrLocalCounter() // <-- call the function
}
rlocalCounter()中的函数{
var本地计数器=0;
返回函数(){
本地计数器++
console.log(本地_计数器)
};
};
返回{
递增计数器:递增计数器,
incrLocalCounter:incrLocalCounter()//
本地计数器中的iLife不应该在本地计数器上创建闭包吗
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
}
})();
是的。local\u counter
当时处于0
。然后通过执行IIFE将其从0
增加到1
。然后返回1
。并执行相同的顺序(包括将local\u counter
设置为0
)每次调用incrLocalCounter
。区别不在于incrLocalCounter
有生命;区别在于正在递增的变量是否在函数内重置。每次在其正常词法范围外调用函数时,它都会创建闭包-这不是真正正确的n调用基本上总是创建一个闭包,尽管在许多情况下闭包是空的。