初始化一个带有 id 的变量,这导致许多 setInterval 函数在 for 循环中执行。现在我的问题是,每个 setInterval 函数都将分配给一个变量,一个变量是否可以包含所有 setIntervals id 的值或仅包含一个?如果所有 id 都可以包含在单个变量中,是否可以通过变量中包含的 id 清除某些 setIntervals,或者我需要为每个 setInterval 声明一个唯一的变量才能做到这一点?
var intervalId;
for(var i = 0; i < 10; i++) {
intervalId = setInterval(function() {}, 100);
}
从 setInterval
和 setTimeout
返回的值是数字,因此只有一个值会"适合"在变量中。
你可以创建一个数组:
var intervalId = [];
for(var i = 0; i < 10; i++) {
intervalId.push( setInterval(function() { ... }, 100) );
}
请注意,您的问题中缺少一些重要的东西,那就是区间函数中的代码。具体来说,如果该代码想要引用"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"的每个值"冻结"在单独的每个计时器变量中。
edit — @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,那么你需要一个外部缓存来存储 ids。