1

forループでIDを使用して変数を初期化するsetInterval関数があります。これにより、forループで多数のsetInterval関数が実行されます。setInterval 関数のそれぞれが変数に割り当てられるようになりました。私の質問は、1 つの変数に setIntervals id のすべての値または 1 つだけの値を含めることは可能ですか? すべての ID を単一の変数に含めることができる場合、変数に含まれる ID を介して特定の setIntervals をクリアすることは可能ですか、それとも setInterval ごとに一意の変数を宣言する必要がありますか?

var intervalId;
for(var i = 0; i < 10; i++) {
     intervalId = setInterval(function() {}, 100);
}
4

1 に答える 1

4

setIntervalとから返される値setTimeoutは数値であるため、変数に「適合」するのは 1 つだけです。

配列を作成できます:

var intervalId = [];
for(var i = 0; i < 10; i++) {
     intervalId.push( setInterval(function() { ... }, 100) );
}

あなたの質問には重要な何かが欠けていることに注意してください。それは interval 関数のコードです。具体的には、そのコードが "i" を参照したい場合、問題があります。個別の関数はすべて同じ "i" 変数 (ループ ヘッダーで宣言された変数)を共有します。

これを回避するには、次のようにします。

 function makeTimerFunction(i) {
   return function() {
     // the code
     if (whatever) { clearInterval(intervalId[i]); }
     // and so on
   };
 }

 var intervalId = [];
 for (var i = 0; i < 10; i++) 
   intervalId.push( setInterval( makeTimerFunction(i), 100 ) );

別の関数を使用することで、別のスコープを作成し、「i」の各値を個別のタイマーごとの変数に「固定」できます。

編集— @pst は、ハンドラー関数からタイマー ID を参照したい場合は、その "intervalId" 配列はまったく必要ないことを正しく指摘しています。ラッパーを使用するだけです。への呼び出しを分離する関数setInterval()

function createTimer() {
  var timerId = setInterval(function() {
    // the code
    if (whatever) { clearInterval( timerId ); }
    // ...
  };
}

for (var i = 0; i < 10; ++i)
  createTimer();

このようにして、各タイマーは独自のプライベート タイマー ID 変数で設定されます。もちろん、関数の外部でタイマー ID必要な場合は、ID 用の外部キャッシュが必要です。

于 2012-08-09T00:49:07.403 に答える