51

在为 Web 应用程序处理一些 Javascript 时,我注意到我使用了setTimeout,但我试图清除它,clearInterval它阻止了 Google Chrome 和 Internet Explorer 9 中发生的超时。

clearTimeoutclearInterval可互换的吗?

这是一个 JSfiddle,其中包含我正在谈论的示例。

4

4 回答 4

33

实际上,我相信我们可以从 W3C 规范 ( http://www.w3.org/TR/html5/webappapis.html#timers ) 中得出一个相当有力的结论。它没有明确保证,但我们有很多证据表明几乎任何合理的实现都会有这种行为:

1) Timeouts 和 Intervals 实际上使用相同的底层函数:

setTimeout() 方法必须返回计时器初始化步骤返回的值,将方法的参数传递给它们……并将重复标志设置为 false。

setInterval() 方法必须返回计时器初始化步骤返回的值,将方法的参数传递给它们......并将重复标志设置为 true。

2)这个单一的功能——上面提到的“定时器初始化步骤”——使用一个定时器列表:

2, ...让句柄是用户代理定义的大于零的整数,它将标识此调用在活动计时器列表中设置的超时。

10、返回手柄...

3) clearTimeout() 和 clearInterval() 都在该列表上运行(实际上并没有以任何方式被规范区分)

clearTimeout() 和 clearInterval() 方法必须从调用该方法的 WindowTimers 对象的活动计时器列表中清除标识为句柄的条目,其中句柄是传递给该方法的参数,如果有的话。(如果句柄在调用该方法的 WindowTimers 对象的活动计时器列表中没有标识条目,则该方法不执行任何操作。)

我相信这提供了一个相当有力的案例,即 clearTimeout 和 clearInterval 根据规范应该是同义词。事实证明,这在我测试的所有浏览器(Chrome 37、Firefox 33 和 Opera 25)中都有效。

于 2014-12-09T00:21:59.470 回答
27

不,它们不可互换。

当然,一些浏览器很可能共享相同的代码以以相同的方式清除间隔和超时,但这并不意味着它们是可互换的,并且您肯定不能保证它们在所有浏览器实现中都可以正常工作。归结为这两种方法因不同目的而定义不同,因此您应该将它们用于指定用途。否则,您只是在自找麻烦。

于 2012-03-28T18:56:44.340 回答
24

来自Mozilla 参考

值得注意的是,setTimeout() 和 setInterval() 使用的 ID 池是共享的,这意味着您可以在技术上互换使用 clearTimeout() 和 clearInterval()。但是,为清楚起见,您应该避免这样做。

于 2017-03-03T01:31:39.283 回答
0

即使它们现在可以同义使用,将来也可能随时改变。为什么你不应该直言不讳?:-)

于 2012-03-28T18:43:08.493 回答