繁体   English   中英

for循环中的函数的行为类似于闭包

[英]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 ivar j

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM