2009-06-02 97 views
32

两个问题:的setInterval/setTimeout的返回值

  1. 如何从setIntervalsetTimeout返回的值(使用的那些清除定时器)计算出来的?

  2. 这两个函数是否有可能在运行时返回相同的值? 例如:

    var a = setInterval(fn1, 1000);
    var b = setTimeout(fn2, 1000);

是否有可能为ab具有相同的价值?

第一个问题更多的是我的知识问题,但第二个问题更重要。

回答

32

Returns a value which can be used to cancel the timer.所以,他们返回相同的值(除非是重用值和一个计时器已取消)

Mozilla states it's DOM level 0, but not part of the specification.(看页面的底部)

这似乎不太可能

我有一个更好的参考:

Nabble说:

的setTimeout和setInterval是回回m 最初的Javascript规范, pre-ECMA。该规范不是 正式在任何地方标准化,但 它支持所有网络浏览器 和大多数实现的JavaScript语言 。 (包括 ActionScript)

ECMA之前的规范通常被称为 “DOM-0”API。由于他们有 以前从未标准化,所以它 对HTML5有意义,最终规范 未弃用的API尝试 跨浏览器提供一致的环境 。特别是当最近的事件 已经证明有 是公司谁喜欢执行 信的标准,但不是 的精神。

阅读原始规格here或从Sun(谁是JavaScript的早期代言人)。

2

从Mozilla的网站:

intervalID是一种独特的间隔ID可以传递给clearInterval()。

所以它是独一无二的:)

+1

对于从多个setInterval调用返回的值,它可能是唯一的,但不能保证与setTimeout返回的值有关的唯一性。 – 2009-06-02 15:29:59

+0

“这两个函数是否有可能在运行时返回相同的值?” - 所以呃不,他们是独一无二的:) – Ropstah 2009-06-02 15:34:41

6

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

+0

他们将永远不会*具有相同的价值?无论脚本运行多长时间? – aditya 2009-06-02 15:23:12

+1

值得关注一下我的答案,了解它是如何得到支持的确切背景以及它是否属于“规范”。 – cgp 2009-06-02 15:25:19

1

它们是否可以具有相同的值取决于JavaScript的实现。正如Maciej在Firefox中提到的,它们不可能具有与使用相同计数器相同的值。但是,其他浏览器可能会有所不同,所以最好不要依赖它们从不具有相同的价值。

31

Opera 9中,Safari浏览器3,火狐3和IE 7.

下测试所有这些返回的整数值,从1开始,然后通过1对每个呼叫递增到setTimeOut()setInterval()。然而,我注意到,浏览器启动计数器和处理它们是不同的:

  • IE开始了(貌似)随机6位数字,但随后要么函数调用递增此号码。在关闭并重新打开IE后,我发现起始号码似乎是随机生成的,因为它远没有接近前一次会话的计数。
  • Opera为每个选项卡维护一个计数器 - 关闭一个选项卡并打开一个新选项卡,从新选项卡中的1开始计数。
  • 在Safari中,计数是全局的 - 打开一个新选项卡并在不同选项卡中调用函数似乎增加了一个全局参考计数器。
  • 在Firefox中,计数器看起来从2开始,并在随后每次调用任一函数时递增。像歌剧一样,每个标签都有自己的计数器值,但它们似乎都以2开头。

但请注意,在所有场景中,没有两个标识符(至少在同一个标​​签中)是相同的。

1

听起来,返回值是任何内部维护的定时器/间隔列表的索引值。

至此,我调用clearInterval(18)而不是clearInterval(var_returned_from_set),并停止了所需的定时器/间隔。 (经过测试的FF17.0.1和IE9.0.8)

另外在我自己的测试中,它们似乎对于这两种浏览器的页面生命周期都是唯一的。