1

これには本当に簡単な解決策があると確信していますが、頭を包むことはできません。次のように、for ループ内でオブジェクトの配列を作成しようとしています。

for(var i = 0; i < 100; i++) {
    foos[i] = new Foo(i*10);
    bars[i] = someObject.createBar({
         x : 0,
         y : 0,
         foobar = function() {
              foo[i].a = true;
         }
    });
}

これを実行しようとすると、「undefined のプロパティ a を設定できません」というメッセージが表示されます。コードの前半で、foo と bar の両方がグローバルとして宣言されています。

foos[0] として foos を作成し、bars[0] からアクセスすると問題なく動作します。関数レベルのスコープと関係があるのではないかと思いますが、私が見る限り、グローバルオブジェクトで配列にアクセスできるはずです....

4

4 に答える 4

3

の値を「固定」する必要がありますi。これをする...

for(var i=0; i<100; i++) {
    (function(i) {
        // now do stuff with i
    })(i);
}
于 2012-06-18T19:12:46.467 に答える
0

「foo[i]」は未定義であるため、未定義の値「a」を設定することはできません。foo[i] を定義したことがありません。もしかして、foos[i]のことですか?

また、他の人が言ったように、関数 foobar は、作成するすべてのオブジェクトに対して同じ値の i を使用します。i を使用して新しいクロージャーを作成する必要があります。これにより、内部関数ごとに異なるローカル変数 i を定義できるようになります。

for(var i=0; i<100; i++) {
   (function(i) {
      // now do stuff with i
   })(i);
}
于 2012-06-18T19:17:26.640 に答える
0

これを試して:

for(var i = 0; i < 100; i++) { 
    foos.push( new Foo(i*10) ); 
    bars.push( someObject.createBar({ 
         x : 0, 
         y : 0, 
         foobar = function() { 
              foo[i].a = true; 
         } 
    }) ); 
} 
于 2012-06-18T19:11:13.470 に答える
0

foob​​ar の実行における i の値は、ループの最後の値 (100) です。ループ ブロックはクロージャであるためです。

必要な値を保存することをお勧めします。例えば ​​:

for(var i = 0; i < 100; i++) {
    foos[i] = new Foo(i*10);
    bars[i] = someObject.createBar({
         x : 0,
         y : 0,
         i : i,
         foobar: function() {
              foos[i].a = true;
         }
    });
}

または、ループ内で中間クロージャーを使用して i を囲みます。

for(var i = 0; i < 100; i++) {
    (function(i){
        foos[i] = new Foo(i*10);
        bars[i] = someObject.createBar({
             x : 0,
             y : 0,
             foobar: function() {
              foos[i].a = true;
             }
        });
    })(i);
}

最初の解決策はより明示的であり、2 番目の解決策はおそらくより一般的です。

于 2012-06-18T19:12:14.130 に答える