我正在尝试理解闭包,我以为我已经理解了它,直到我遇到了以下解决方案:
我不明白这怎么会提醒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之后的额外()
将执行返回的函数。我还了解到,由于闭包的原因,return函数在执行时将可以访问变量r。
然而,我不明白在下一次迭代中,r的状态将如何保持。在下一次迭代中,当next()
get再次运行时,r
变量将在函数范围内,不会受到全局变量的任何影响,它如何知道前一个next()
中r的状态。即使是这样,var r = 0
不会将r
重置为0吗?
发布于 2018-10-06 12:46:14
外部生命只运行一次,如末尾的()
所示:
var next = (function(){
var r = 0;
return function(){
return r++;
}
})()
^^
因此,当解释器遇到var next = ...
行时,line运行,创建r
变量,然后返回以下函数:
function(){
return r++;
}
next
被赋值给调用calling的结果,calling返回该函数。因此,将来当您调用next
时,您就是在调用上面的(小)函数--调用next
不会再次调用整个生命周期,而且r
变量只有一个绑定。
如果next
是一个创建r
的未被调用的函数,那么您就对了,每次调用next
都会为r
创建一个具有新绑定的新函数
var next = function(){
var r = 0;
return function(){
return r++;
}
}
for (var i = 0; i<=5; i++){
var theFn = next();
console.log(theFn());
}
https://stackoverflow.com/questions/52675773
复制相似问题