我有以下代码:
var arr = [{Name: "foo", action: function(){ alert("foo")}},
{Name: "bar", action: function(){ alert("bar")}}
]
var arr2 = {};
for(var i =0; i< arr.length; i++)
{
var bla = arr[i];
arr2[bla.Name] = function(){ bla.action() };
}
arr2.foo();
arr2.bar();
警告两次“bar”。 相反,我做了
arr2[bla.Name] = bla.action;
有效。
任何方式使它在第一种情况下工作(我需要在我的函数中附加其他东西)
谢谢!
答案 0 :(得分:3)
这是因为你的匿名函数中的bla
是一个引用,并且它在循环内不断更新以指向下一个对象。当循环终止时,它们都将指向您在循环中引用的最后一个元素。
您可以通过执行类似
的操作来解决此问题arr2[bla.Name] = (function(x) { return function(){ x.action(); }})(bla);
答案 1 :(得分:2)
bla
的值正在发生变化,您创建的函数将始终使用调用时的值。
您可以创建一个闭包来保护bla
变量:
for(var i =0; i< arr.length; i++) {
(function(bla){
arr2[bla.Name] = function(){ bla.action() };
})(arr[i]);
}
如果您的action
函数不需要任何上下文或参数,您也可以简化
for(var i =0; i< arr.length; i++) {
var bla = arr[i];
arr2[bla.Name] = bla.action;
}