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

Is it possible to call a clearInterval method on a setInterval variable that is out of scope?

本文关键字:变量 setInterval 调用 clearInterval 方法 范围 是否      更新时间:2023-09-26
我有一个 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。