2

次のコードがあります。

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();

「バー」を 2 回警告します。代わりに私がするとき

    arr2[bla.Name] = bla.action;

それは機能します。

最初のケースで機能させる方法(関数に他のものを追加する必要があります)

ありがとう !

4

2 に答える 2

3

これblaは、匿名関数内が参照であり、ループ内で次のオブジェクトを指すように更新され続けるためです。ループが終了すると、それらはすべて、ループ内で参照した最後の要素を指します。

次のようなことを行うことで修正できます

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

フィドル

于 2013-02-01T07:45:46.977 に答える
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;
}    
于 2013-02-01T07:44:32.807 に答える