clearTimeout 和 clearInterval 是一样的吗?

IT技术 javascript clearinterval
2021-03-16 18:07:49

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

clearTimeoutclearInterval互换?

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

4个回答

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

1)超时和间隔实际上使用相同的底层函数:

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

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

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

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

10、返回手柄...

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

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

我相信这是一个相当有力的例子,根据规范, clearTimeout 和 clearInterval 应该是同义词。这是因为它适用于我测试的所有浏览器(Chrome 37、Firefox 33 和 Opera 25)。

我只是注意到我多年来一直在使用其中的一个错误!似乎没有给我的用户带来任何问题。所以我会说所有现代浏览器都将它们视为相同。
2021-05-03 18:07:49

不,它们不可互换。

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

其实,各大浏览器的实现都已经很麻烦了。如果我定义了一个超时和清除间隔,并且某个 ID 显然是相同的 ID,我希望我的超时持续存在。而事实并非如此。
2021-04-21 18:07:49
@RoboRobok 超时和间隔共享相同的 ID 池。这意味着您永远不会像您描述的那样重复使用 ID如果 setTimeout 返回 ID,则 setTimeout(或再次 setInterval)将永远不会在同一窗口/工作器对象上返回相同的 ID。
2021-04-22 18:07:49

Mozilla 参考

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

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

我有一个间隔,有时需要从中间开始,所以我使用超时,然后使用间隔。有时需要停止间隔,但我宁愿没有两个数组(一个用于超时,一个用于间隔),而我可以只有一个。
2021-04-23 18:07:49
是的,不使用未发布的功能是一个很好的标准做法,但这并不能回答现在的问题。
2021-05-13 18:07:49