2

javascriptを使用してオブジェクトを作成しながら関数を実行するにはどうすればよいですか?

次のコードを実行する

 var y = [] ;
 var x = [[1,2,3] , [4,5,6] , [7,8,9]]
 for (var i = 0 ; i < 3 ; i++){
     y.push({name :'MyName' , value:function(){return x[i]} }) ; 
 }

 console.log(y) ;  

次のオブジェクトを生成します

{name : 'MyName' , value : function (){return x[i]}

質問

これを持つこのオブジェクト関数を実行するにはどうすればよいですか?

{name : 'MyName' , value : function (){return [1,2,3]}

eval()うまくいかなかった

これが私のjsFiddleです

あなたがこれをしているのかと尋ねる人々のためにWHY?オブジェクトが値によってコピーされるため、これを実行しているので、すべての私object.ValueがX[2]に等しくなります。

4

2 に答える 2

2

その奇妙なコード。何を達成しようとしているのかわかりません。しかし、あなたが抱えている問題はi、ループ全体で増分されていることです。したがって、最終的に関数を呼び出すと、の値は3になり、配列iの境界を超えます。x次のように修正できます。

var y = [] ;
var x = [[1,2,3] , [4,5,6] , [7,8,9]]
for (var i = 0 ; i < 3 ; i++){
    y.push({
        name :'MyName',
        index: i,
        value:function(){return x[this.index]; } 
    }) ; 
}

console.log(y[0].value()); 

または、実行する関数を明示的に必要としない場合:

var y = [] ;
var x = [[1,2,3] , [4,5,6] , [7,8,9]]
for (var i = 0 ; i < 3 ; i++){
    y.push({
        name :'MyName',
        value: x[i]
    }) ; 
}

console.log(y[0].value); 
于 2013-02-11T17:21:39.320 に答える
0

これらのオブジェクトを配列に正常に追加するには、y.push()ステートメントでクロージャーを作成する必要があります。クロージャは、変数x [i]が呼び出されたときにvalue()関数で使用できるようにします。

以下のコードは、オブジェクトの「value()」関数を閉じて自己完結型の環境を作成する「addItem()」関数を定義します。つまり、「value()」関数は、「addItem()」関数が終了した後でも、「addItem()」関数内で定義または渡された変数にアクセスできます。

var i = 0
var y = [] ;
var x = [[1,2,3] , [4,5,6] , [7,8,9]];

function addItem(item) {
    y.push({
        name: 'MyName', 
        value: function () {
            return item;
        }
    });
}

for ( ; i < 3 ; i++) {
    addItem(x[i]);
}

console.log(y);
/*
[ { name: 'MyName', value: [Function] },
  { name: 'MyName', value: [Function] },
  { name: 'MyName', value: [Function] } ]
*/
console.log(y[0].value()); // [1, 2, 3]
console.log(y[1].value()); // [4, 5, 6]
console.log(y[2].value()); // [7, 8, 9]

ループ内で無名関数を使用して同じことを実現することもできますが、forループを回るたびに新しい関数が作成されるため、これを行わないことを選択します。

于 2013-02-11T18:06:31.733 に答える