清除定时器的函数clearTimeout和clearInterval是相同的吗?

56

6
尽管在大多数实现中这可能是真的,但你不应该依赖它,因为它并没有被定义为这样。 - James Montagne
它可能在某些浏览器中工作,但在所有浏览器中可能不会以相同的方式工作,所以我实际上不会这样做。 - gen_Eric
很棒的问题(和答案),感谢您的提问! - Myster
我也注意到了这个问题,并在Node.js中进行了测试,因为Node似乎有一个非常不同的interval和timeout实现方式(它们返回对象而不是数字ID)。但是行为也存在于那里:您可以使用从setInterval返回的对象调用clearTimeout,并且它确实会结束循环。 - Semicolon
4个回答

34

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

1) 超时和间隔实际上使用相同的基础功能:

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

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

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

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

10,返回handle...

3) clearTimeout()和clearInterval()都在该列表上操作(事实上,在规范中没有以任何方式区分它们)

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

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


我刚刚注意到这些中的一个我用错了多年!似乎并没有给我的用户带来任何问题。所以我可以说所有现代浏览器都将它们视为相同的。 - rgbflawed

30

不,它们不能互换使用。

当然,一些浏览器可能会使用相同的代码来清除计时器和定时器,但这并不意味着它们是“可互换的”,您绝对不能保证它们在所有浏览器实现中都能工作得一样。这两种方法被定义为不同的目的,因此您应该按照其指定的用途使用它们。否则,您只是自找麻烦。


实际上,所有主要浏览器中的实现都已经引起了麻烦。如果我使用某个ID定义一个超时并清除间隔,显然是相同的ID,我期望我的超时会持续存在。但它没有。 - Robo Robok
2
@RoboRobok 超时和间隔共享相同的 ID 池。这意味着,您描述的情况下永远不会重复使用 ID。如果 setTimeout 返回一个 ID,则在同一窗口/工作器对象上再次调用 setTimeout(或 setInterval)时将永远不会返回相同的 ID。 - drmercer

26

来自Mozilla参考文档

值得注意的是,setTimeout()和setInterval()使用的ID池是共享的,这意味着你在技术上可以使用clearTimeout()和clearInterval()相互替换。但是,为了更清晰明了,应避免这样做。


0

即使它们现在可以互换使用,但未来随时可能会改变。为什么不直接称呼事物的真实名称呢?:-)


1
是的,不使用未发布的功能是一个很好的标准实践,但这并没有回答问题,对吧。 - Daisetsu
1
我有一个间隔,有时需要从中间开始,因此我使用超时和间隔。有时需要停止间隔,但我宁愿不要有两个数组(一个用于超时,一个用于间隔),而是只使用一个。 - Seph Reed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接