是否可以对超出范围的 setInterval 变量调用 clearInterval 方法
Is it possible to call a clearInterval method on a setInterval variable that is out of scope?
我有一个 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);
}
从 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。
相关文章:
- setinterval函数,使用变量的前一个/旧值
- 是否可以对超出范围的 setInterval 变量调用 clearInterval 方法
- for 循环中 setInterval 中计数器变量 i 的作用域
- 将变量传递给 setInterval 函数
- 将随机生成的变量传递给 setInterval
- 使用变量作为 setInterval / setTimeout 中的时间
- 如何在 setInterval 完成后传递变量
- javascript:带有全局变量的setInterval
- 虽然在控制台中未定义,但setInterval中的javascript变量会在警告框中显示其值
- setInterval() 的动态变量名称
- 使用变量setInterval在iOS上不工作
- 递增setInterval,不带全局变量
- 我不能改变setInterval内的全局变量
- setInterval变量不可访问
- setInterval()变量更改错误
- JavaScript中的类变量和setInterval
- 如何将setInterval周期设置为变量并删除等待时间
- 如何从setInterval()函数中获取变量?
- 更新由函数创建的对象中的Javascript变量setInterval
- 设置变量的setInterval为false