我最近一直在研究闭包并开始掌握它,我从在线内容和我之前的问题here中了解到,当在另一个函数内部创建函数时会创建闭包(不要知道这是否是关闭存在的唯一条件)。我决定对此进行更多实验,这些代码让我感到困惑,我没想到输出。
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();
});
它打印了预期的输出。我错过了什么?
答案 0 :(得分:5)
问题在于您正在重新定义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
。