43

两个问题:

  1. setIntervalsetTimeout(用于清除计时器的)返回的值是如何计算的?

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

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

a是否有可能b具有相同的价值?

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

4

6 回答 6

38

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

Mozilla 声明它是 DOM 级别 0,但不是规范的一部分。(看页面底部)

我有一个更好的参考:

纳布尔说:

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

ECMA 之前的规范通常被称为“DOM-0”API。由于它们以前从未被标准化,因此 HTML5 最终指定未弃用的 API 以尝试提供跨浏览器的一致环境是有意义的。尤其是当最近的事件证明,有些公司喜欢执行标准的字母,而不是精神。

在此处阅读原始规范,或来自Sun(他是 JavaScript 的早期支持者)。

于 2009-06-02T15:15:41.987 回答
35

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

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

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

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

于 2009-06-02T15:27:50.277 回答
7

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

于 2009-06-02T15:14:17.213 回答
3

从 Mozilla 网站:

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

所以它是独一无二的:)

于 2009-06-02T15:13:55.233 回答
2

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

于 2009-06-02T15:24:40.203 回答
0

在我看来,返回的值是它们所保留的任何内部维护的计时器/间隔列表的索引值。

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

同样在我自己的测试中,它们在这两种浏览器的页面生命周期内似乎都是独一无二的。

于 2014-03-05T16:52:27.067 回答