在为 Web 应用程序处理一些 Javascript 时,我注意到我使用了setTimeout
,但我试图清除它,clearInterval
它阻止了 Google Chrome 和 Internet Explorer 9 中发生的超时。
是clearTimeout
和clearInterval
可互换的吗?
这是一个 JSfiddle,其中包含我正在谈论的示例。
在为 Web 应用程序处理一些 Javascript 时,我注意到我使用了setTimeout
,但我试图清除它,clearInterval
它阻止了 Google Chrome 和 Internet Explorer 9 中发生的超时。
是clearTimeout
和clearInterval
可互换的吗?
这是一个 JSfiddle,其中包含我正在谈论的示例。
实际上,我相信我们可以从 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)中都有效。
不,它们不可互换。
当然,一些浏览器很可能共享相同的代码以以相同的方式清除间隔和超时,但这并不意味着它们是可互换的,并且您肯定不能保证它们在所有浏览器实现中都可以正常工作。归结为这两种方法因不同目的而定义不同,因此您应该将它们用于指定用途。否则,您只是在自找麻烦。
来自Mozilla 参考:
值得注意的是,setTimeout() 和 setInterval() 使用的 ID 池是共享的,这意味着您可以在技术上互换使用 clearTimeout() 和 clearInterval()。但是,为清楚起见,您应该避免这样做。
即使它们现在可以同义使用,将来也可能随时改变。为什么你不应该直言不讳?:-)