1

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

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

1 回答 1

4

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”的每个值“冻结”在单独的每个计时器变量中。

编辑——@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 回答