迭代函数定义的Javascript闭包

迭代函数定义的Javascript闭包,javascript,function,closures,Javascript,Function,Closures,可能重复: 以前可能有人问过这个问题,但是 如果我想要一个函数列表 var funs = [ function(){ console.log(1); }, function(){ console.log(2); }, function(){ console.log(3); }, function(){ console.log(4); }, function(){ console.log(5); } ] 似乎可以通过以下方式实现: var funs = []; for(va

可能重复:

以前可能有人问过这个问题,但是

如果我想要一个函数列表

var funs = [
  function(){ console.log(1); },
  function(){ console.log(2); },
  function(){ console.log(3); },
  function(){ console.log(4); },
  function(){ console.log(5); } ]
似乎可以通过以下方式实现:

var funs = [];
for(var i=1; i <= 5; i++){
  funs.push(function(){ console.log(i) };
}
输出

6
6
6
6
6
不是


这不是我想要的输出。我想我需要强制javascript在创建函数时绑定
I
值的副本,而不是用
I
的引用结束。如何执行此操作?

最简单的方法是通过自执行函数的参数传递函数:

for(...) {
    (function(i) {
        // here you have a new i in every loop
    })(i);
}

最简单的方法是通过自执行函数的参数传递函数:

for(...) {
    (function(i) {
        // here you have a new i in every loop
    })(i);
}

使用闭包是可行的,但我只想补充一点,实现这一点的现代方法(JS>1.8.5)是使用
bind
——请参阅@daviditarenco:You是指
push(console.log.bind(console,I))
?当然,这比嵌套两个函数更优雅。你实际上也可以做
push(console.log.bind(null,i))
(因为你并不真正关心
这个
对于我们来说是什么),但是是的。@daviditarenco:这至少在Chrome中会被打破,因为
控制台
必须是
log()的上下文
@ThiefMaster:你说得对!我在测试Firebug。正如他们所说,不同的笔划。使用闭包是有效的,但我只想补充一点,现代的方法(JS>1.8.5)是通过使用
bind
-参见@daviditarenco:You是指
push(console.log.bind(console,I))
?当然,这比嵌套两个函数更优雅。你实际上也可以做
push(console.log.bind(null,i))
(因为你并不真正关心
这个
对于我们来说是什么),但是是的。@daviditarenco:这至少在Chrome中会被打破,因为
控制台
必须是
log()的上下文
@ThiefMaster:你说得对!我在测试Firebug。正如他们所说,不同的笔触。
for(...) {
    (function(i) {
        // here you have a new i in every loop
    })(i);
}