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 用の外部キャッシュが必要です。