setInterval/setTimeout return value

43
两个问题:
1. setIntervalsetTimeout(用于清除计时器的)返回的值是如何计算的? 2. 在运行时,这两个函数是否可能返回相同的值? 例如: var a = setInterval(fn1, 1000); var b = setTimeout(fn2, 1000); a 和 b 是否可能具有相同的值?
第一个问题更多是我想知道的,但第二个问题更重要。
6个回答

39

返回可用于取消定时器的值。 因此,它们似乎不会返回相同的值(除非它们正在重复使用值并且其中一个定时器已被取消)。

Mozilla称它为DOM 0级,但不是规范的一部分。 (请查看页面底部)

我还有更好的参考资料:

Nabble表示:

SetTimeout和setInterval来自原始JavaScript规范,即ECMA之前的版本。该规范在任何地方都没有正式标准化,但它得到了所有Web浏览器以及JavaScript语言的大多数实现的支持。(包括ActionScript。)

ECMA之前的规范通常被称为“DOM-0”API。由于它们以前从未被标准化过,因此HTML5最终为这些弃用的API制定规范,以尝试在浏览器之间提供一致的环境。特别是最近发生的事件证明,确实有一些公司喜欢实现标准的字面意思,但不喜欢实现它所代表的精神。

在此处阅读原始规范或者可以从Sun(早期支持JavaScript的公司)这里阅读它。


希望我能选择两个被接受的答案。谢谢提供参考! - aditya
2
十年后,在HTML5时代,根据WhatWGW3C HTML规范,ID“必须在实现[WindowOrWorkerGlobalScope mixin]/[WindowTimers interface]的对象的生命周期内唯一”。基本上,任何符合规范的实现都不会再次使用ID(在一个窗口范围内)。setTimeout和setInterval使用相同的ID列表(并且不会重用另一个使用过的ID)。 - Bob

35

在Opera 9、Safari 3、Firefox 3和IE 7下进行了测试。

setTimeOut()setInterval()的每次调用都返回从1开始递增的整数值。但是,我注意到浏览器启动计数器并以不同的方式处理它们:

  • IE从一个看似随机的6位数开始,但对任一函数的后续调用都会递增此数字。在关闭并重新打开IE后,我发现起始数字似乎是随机生成的,因为它与上一个会话的计数不相近。
  • Opera为每个选项卡维护计数器 - 关闭一个选项卡并打开一个新选项卡会在新选项卡中从1开始计数。
  • 在Safari中,计数是全局的 - 在不同的选项卡中打开新选项卡并调用这些函数似乎会递增全局引用计数器。
  • 在Firefox中,计数器似乎从2开始,并在后续每次调用setTimeOut()setInterval()时递增。像Opera一样,每个选项卡都有自己的计数器值,但它们似乎都从2开始。

请注意,在所有情况下,没有两个标识符(至少在同一选项卡中)是相同的。


11
我希望了解返回的值是否始终为truthy,似乎是这种情况,尽管没有指定。感谢您检查所有那些浏览器。 - w00t

7

我认为这不是一种标准行为。在Firefox中,它只是一个整数,在每次调用setTimeoutsetInterval时递增。而且,它们不能具有相同的值。


它们永远不会有相同的值?无论脚本运行多长时间? - aditya
1
值得一看的是我的答案,可以了解它是如何被支持以及它是否“在规范中”的确切背景。 - cgp
@aditya 我认为它会检查生成的ID是否已经存在于内存中,如果存在,则在极少数情况下生成一个新的ID。如果处理随机数,那就是我会做的事情。 - Braden Best

3

来自 Mozilla 网站:

intervalID 是您可以传递给 clearInterval() 的唯一间隔 ID。

所以它是唯一的 :)


1
它可能在返回多个setInterval调用的值方面是独特的,但这并不能保证在setTimeout返回的值方面是独一无二的。 - system PAUSE
"这两个函数在运行时返回相同的值是可能的吗?" - 噢,不,它们是独一无二的 :) - Ropstah

2

它们是否具有相同的值取决于JavaScript实现。正如Maciej在Firefox中提到的那样,它们不能具有相同的值,因为使用了相同的计数器。然而,在其他浏览器中可能会有所不同,因此最好不要依赖于它们永远不具有相同的值。


0

听起来返回的值是他们内部维护的计时器/间隔列表的索引值。

例如,我调用了clearInterval(18)而不是clearInterval(var_returned_from_set),它停止了所需的计时器/间隔。(在FF17.0.1和IE9.0.8中测试过)

在我的测试中,它们在这两个浏览器的页面生命周期内似乎是唯一的。


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