0

私はいくつかの関数を次々に動作させようとしていますが、その間に 1.5 秒の待ち時間があります。

今、同じIDでそうしようとすると(1、2、3、またはその他のように、「NoteList(> here <)」内で機能します。

for (var i = 0; i < 36; i++)
{
    setTimeout(function () { OnClcRandom(NoteList[0]) }, i * 1000 + 1000);

}

しかし!変数 i を使用して実行しようとすると、機能せず、ページ内のすべての機能が動かなくなります。理由はありますか?

   for (var i = 0; i < 36; i++)
        {
            setTimeout(function () { OnClcRandom(NoteList[i]) }, i * 1000 + 1000);

        }
4

2 に答える 2

1

これは、すべての関数が、呼び出した時点の変数の値ではなく、同じライブ i変数を参照しているためですsetTimeout()。つまり、タイムアウトが実際に機能iを実行するまでには36.

代わりにこれを試してください:

    for (var i = 0; i < 36; i++) {
        (function(x){
           setTimeout(function () { OnClcRandom(NoteList[x]) }, i * 1000 + 1000);
        )(i);
    }

これにより、ループの反復ごとに無名関数が実行され、実行ごとに元の関数で使用するための独自のxパラメーターが取得されます。

于 2013-04-06T12:02:22.677 に答える
1

Javascript は、ブロックのローカル スコープを作成しません。:)

2 番目の例では、var i は 36 (最後の値) です。ループ内にローカル スコープを作成する必要があります。

for (var i = 0; i < 36; i++) {

 (function (i) {
   setTimeout(.......);
}(i))

}

'i' 値を修正して、それを関数プロパティに割り当てることもできます。

for (var i = 0, f; i < 36; i++){
  f = function _callback() { var i = _callback.i; .....};
  f.i = i;
  setTimeout(f, i * 1000);
}
于 2013-04-06T12:04:43.967 に答える