我试图理解闭包,我以为我理解了它,直到我遇到以下解决方案:
我不明白这将如何提醒 0、1、2、3、4、5
var next = (function(){
var r = 0;
return function(){
return r++;
}
})()
for (var i = 0; i<=5; i++){
alert(next());
}
我明白第一次迭代是如何工作的,只有next
,函数将执行并返回返回函数,然后next之后的额外()
将执行返回的功能。
我还了解到,由于 Closure,执行时的返回函数将可以访问变量 r。
但是我不明白在下一次迭代中,r 的状态将如何持续存在。
在下一次 next()
再次运行时,r
变量将在函数范围内并且不会受到全局任何影响,这是怎么回事它知道 r 在前一个 next()
中的状态。即使是这样,var r = 0
不会将 r
重置为 0 吗?
最佳答案
外部 IIFE 仅运行一次,如末尾的 ()
所示:
var next = (function(){
var r = 0;
return function(){
return r++;
}
})()
^^
因此,当解释器遇到 var next = ...
行时,IIFE 运行,创建 r
变量,然后返回以下函数:
function(){
return r++;
}
next
被分配给调用 IIFE 的结果,IIFE 返回该函数。因此,将来,当您调用 next
时,您将调用上面的(小)函数 - 调用 next
不会再次调用整个 IIFE,并且只有r
变量的任何一个绑定(bind)。
如果 next
是一个创建了 r
的未调用函数,你是对的,每次调用 next
将为 r
创建一个具有新绑定(bind)的新函数:
var next = function(){
var r = 0;
return function(){
return r++;
}
}
for (var i = 0; i<=5; i++){
var theFn = next();
console.log(theFn());
}
关于javascript - 闭包如何帮助函数了解前一个函数调用的私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52675773/