for循环中的函数表现得像一个闭包

时间:2015-12-03 22:33:54

标签: javascript loops closures

我最近一直在研究闭包并开始掌握它,我从在线内容和我之前的问题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();
});

它打印了预期的输出。我错过了什么?

1 个答案:

答案 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