Javascript 函数数组与奇异行为

Javascript 函数数组与奇异行为,javascript,Javascript,我有以下代码: 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.ac

我有以下代码:

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();
这很有效

在第一种情况下,任何使其工作的方法(我需要在函数中附加其他内容)


谢谢

bla的值正在更改,您创建的函数在调用时将始终按原样使用该值

您可以创建一个闭包来保护
bla
变量:

for(var i =0; i< arr.length; i++) {
    (function(bla){
        arr2[bla.Name] = function(){ bla.action() };
    })(arr[i]);
}     

这是因为匿名函数中的
bla
是一个引用,它在循环中不断更新以指向下一个对象。当循环终止时,它们都将指向循环中引用的最后一个元素

您可以通过执行以下操作来修复它

arr2[bla.Name] = (function(x) { return function(){ x.action(); }})(bla);

请注意,
arr2={}
实际上使
arr2
成为一个对象。@AlvinWong:他应该在这里使用一个对象。他有串钥匙。选中此项:@Mark-是的,因此它应该有一个不暗示它是数组的名称…@nnnnnn:Alvin最初说他应该使用
[]
。如果你想谈论命名,他应该选择更多的描述性名称,而不仅仅是基于类型。太好了,忘了那个!谢谢
for(var i =0; i< arr.length; i++) {
    var bla = arr[i];
    arr2[bla.Name] = bla.action;
}    
arr2[bla.Name] = (function(x) { return function(){ x.action(); }})(bla);