迭代函数定义的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);
}