当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《for循环中的函数表现得像一个闭包》经验,为你挑选了1个好方法。

我最近研究关闭,并开始得到它的窍门,我从网上内容,并从我的前一个问题了解这里,当另一个函数内部创建了一个函数闭包被创建(不知道这是不是唯一的条件关闭存在).我决定对此进行更多实验,这些代码让我感到困惑,我没想到输出.

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> TbWill4321..:

问题是你正在重新定义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 ivar j.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有