3

重複の可能性:
ループ内のJavascriptクロージャ-簡単な実用例
ループ内でsetTimeout関数を呼び出す

これを複製と呼ぶ前に、私はインターネットを調べましたが、誰もが異なる問題を抱えているようでした。誰かがこの特定のもので私を助けることができれば、それは大いにありがたいです。

基本的に、私が持っているのはfor、3番目のループの中にネストされた2つのループです。

for (a=0 ... a++) {
    for (b=0 ... b++) {
        setTimeout( ... + a + ..., 1000*b);
    }
    for (c=0 ... c++) {
        setTimeout( ... + a + ..., 1000*c);
    }
}

これは、ジャンクを回避するための疑似コードですが、基本的にはa、タイマーによってトリガーされるコールバック関数に値を渡します。問題はaインクリメントされているという事実に起因しているため、イベントが発生すると、関数はa登録された値ではなく、最後の値を持ちます。

私はそれをC/C ++の参照またはポインターのように考えることができます、これは本当に迷惑です。永続的な価値を与える方法はありますか?

4

1 に答える 1

4

最も単純な形式のクロージャでうまくいきます。

for (a=0 ... a++) {
    (function(a){
       for (b=0 ... b++) {
           setTimeout( ... + a + ..., 1000*b);
       }
       for (c=0 ... c++) {
           setTimeout( ... + a + ..., 1000*c);
       }
    })(a);
}

Pointysの回答を考慮に入れるには:文字列をに渡してはいけませんsetTimeout

次の3つのパラメーター形式を使用してsetTimeout、関数(または関数への参照)、時間値、および関数のパラメーターを渡すことができます。

for (a=0 ... a++) {
     for (b=0 ... b++) {
         setTimeout( function(x){ /*do stuff, using x */}, 1000*b, a);
     }
}

ただし、残念ながら、3パラメータ形式はInternetExplorerでは機能しないことに注意してください。

于 2012-07-23T18:48:34.887 に答える