是否可以对超出范围的 setInterval 变量调用 clearInterval 方法


我有一个 setInterval 函数,该函数在 for 循环中

初始化一个带有 id 的变量,这导致许多 setInterval 函数在 for 循环中执行。现在我的问题是,每个 setInterval 函数都将分配给一个变量,一个变量是否可以包含所有 setIntervals id 的值或仅包含一个?如果所有 id 都可以包含在单个变量中,是否可以通过变量中包含的 id 清除某些 setIntervals,或者我需要为每个 setInterval 声明一个唯一的变量才能做到这一点?

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

setIntervalsetTimeout 返回的值是数字,因此只有一个值会"适合"在变量中。

你可以创建一个数组:

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。

最新更新