2012-03-28 40 views
29

上一些JavaScript工作Web应用程序时,我注意到,我曾使用过setTimeout,但我曾试图与clearInterval以清除它,它在谷歌Chrome和Internet Explorer出现停止超时9是clearTimeout和clearInterval是一样的吗?

clearTimeoutclearInterval可互换?

Here's a JSfiddle举了一个我正在谈论的例子。

+4

尽管在大多数实现中这可能是正确的,但您不应该依赖它,因为它没有以这种方式定义。 – 2012-03-28 18:43:32

+0

它可能适用于某些浏览器,但它可能在所有浏览器中都不一样,所以我实际上不会这样做。 – 2012-03-28 18:43:42

+0

伟大的问题(和答案)谢谢问! – Myster 2012-06-27 08:31:36

回答

19

不,它们不可互换。

当然,一些浏览器很可能共享相同的代码来清除的时间间隔和超时以同样的方式,但并不意味着他们是互换,你肯定不能保证,他们将努力在所有浏览器实现同样的。归结为这两种方法对于不同的目的有不同的定义,因此您应该将它们用于他们的指定用途。否则,您只是在寻求麻烦。

0

即使它们现在可以同义使用,它在将来的任何时候都可能会发生变化。为什么你不应该用铁锹呢? :-)

+1

是的,这是一个很好的标准做法,不使用未发布的功能,但现在没有回答这个问题。 – Daisetsu 2012-03-28 18:44:19

19

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

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

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

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

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

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

10,返回手柄...

3)clearTimeout()和clearInterval()都在名单上进行操作(事实上不被规范以任何方式区分)

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

我相信这是一个相当强大的例子,clearTimeout和clearInterval应该根据规范的同义词。事实证明,这一点在我测试的所有浏览器(Chrome 37,Firefox 33和Opera 25)中都能正常运行。

+6

我不知道它是否只是不正确的代码,但页面可见性API介绍中的第二个示例同时使用'setInterval'和'clearTimeout':http://www.w3.org/TR/page-visibility/#介绍 – TheZ 2015-01-26 17:58:46

8

Mozilla reference

值得一提的是,通过的setTimeout()和 的setInterval()使用的ID池是共享的,这意味着你可以在技术上使用 clearTimeout()和clearInterval()互换。但是,对于清晰度,您应该避免这样做。

相关问题