[英]Function in for loop behaves like a closure
我最近研究关闭,并开始得到它的窍门,我从网上内容,并从我的前一个问题了解这里 ,当另一个函数内部创建了一个函数闭包被创建(不知道这是不是唯一的条件以便关闭)。 我决定对此做更多的实验,而这些代码集让我感到困惑,我没想到输出结果。
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
变量,并且您的close函数可以按预期工作。
如果你想继续使用原生for
,只是改变var i
到var j
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.