我最近研究关闭,并开始得到它的窍门,我从网上内容,并从我的前一个问题了解这里,当另一个函数内部创建了一个函数闭包被创建(不知道这是不是唯一的条件关闭存在).我决定对此进行更多实验,这些代码让我感到困惑,我没想到输出.
var f = []; for(var i = 0; i < 3; i++){ f[i] = function(){ console.log("Number " + i); } }; for(var i = 0; i < 3; i++){ f[i](); } //Actual Output //Number 0 //Number 1 //Number 2 //Expected output //Number 3 //Number 3 //Number 3
我想我还应该提一下,当我用Function.forEach
这样替换第二个循环时
f.forEach(function(i){ i(); });
它打印出预期的输出.我错过了什么?
问题是你正在重新定义i
变量.通过可变提升,您的代码被解释为:
var f = []; var i; for(i = 0; i < 3; i++){ f[i] = function(){ console.log("Number " + i); } }; for(i = 0; i < 3; i++){ // `i` is set back to 0 -> 3 f[i](); }
当您使用forEach
循环切换它时,您不会更改i
变量,并且您的关闭函数将按预期工作.
如果您想继续使用原生for
,只需更改var i
为var j
.