javascript的一些知识
setInterval 的堆调用
setTimeout 只会执行回调函数一次,不过 setInterval - 正如名字建议的 - 会每隔 X 毫秒执行函数一次。 但是却不鼓励使用这个函数。 JavaScript 秘密花园 其它 45 当回调函数的执行被阻塞时, setInterval 仍然会发布更多的回调指令。在很小 的定时间隔情况下,这会导致回调函数被堆积起来。
function foo(){
// 阻塞执行 1 秒
}
setInterval(foo, 100);
上面代码中, foo 会执行一次随后被阻塞了一秒钟。 在 foo 被阻塞的时候, setInterval 仍然在组织将来对回调函数的调用。 因 此,当第一次 foo 函数调用结束时,已经有 10 次函数调用在等待执行。
处理可能的阻塞调用
最简单也是最容易控制的方案,是在回调函数内部使用 setTimeout 函数。
function foo(){
// 阻塞执行 1 秒
setTimeout(foo, 100);
}
foo();
这样不仅封装了 setTimeout 回调函数,而且阻止了调用指令的堆积,可以有更 多的控制。 foo 函数现在可以控制是否继续执行还是终止执行。
手工清空定时器
可以通过将定时时产生的 ID 标识传递给 clearTimeout 或者 clearInterval 函数来清除定时, 至于使用哪个函数取决于调用的时候使用的是 setTimeout 还 是 setInterval 。
var id = setTimeout(foo, 1000);
clearTimeout(id);
清除所有定时器
由于没有内置的清除所有定时器的方法,可以采用一种暴力的方式来达到这一目 的。
// 清空"所有"的定时器
for(var i = 1; i < 1000; i++) {
clearTimeout(i);
}