【问题标题】:setInterval/setTimeout return valuesetInterval/setTimeout 返回值
【发布时间】:2009-06-02 15:11:37
【问题描述】:

两个问题:

  1. setIntervalsetTimeout(用来清空定时器的)返回的值是怎么计算的?

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

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

ab 是否可以具有相同的值?

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

【问题讨论】:

    标签: javascript settimeout setinterval


    【解决方案1】:

    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 来自 原始的 Javascript 规范, 前ECMA。该规范不是 任何地方都被正式标准化,但是 所有网络浏览器都支持它 和大多数实现 Javascript 语言。 (包含 动作脚本。)

    ECMA 之前的规范通常被称为 “DOM-0” API。既然他们有 以前从来没有标准化过 HTML5 最终规范是有意义的 尝试使用未弃用的 API 提供一致的环境 跨浏览器。尤其是当 最近的事件证明,有 是喜欢实施的公司 标准的字母,但不是 精神。

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

    【讨论】:

    • 我希望我能选择两个被接受的答案。感谢您的参考!
    • 10 年后,在 HTML5 后的世界中,根据 WhatWGW3C HTML 规范,ID“在实现的对象的生命周期内必须在列表中是唯一的[WindowOrWorkerGlobalScope mixin]/[WindowTimers 接口]”。基本上,任何符合规范的实现都不会(在一个窗口范围内)重用 ID。 setTimeout 和 setInterval 使用相同的 ID 列表(并且不会重复使用对方使用的任何 ID)。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我希望找出返回的值是否总是真实的,尽管未指定,但似乎确实如此。感谢您检查所有这些浏览器。
    【解决方案3】:

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

    【讨论】:

    • 它们将永远具有相同的值吗?不管脚本运行多长时间?
    • 值得看看我的回答,了解它是如何被支持的以及它是否“在规范中”。
    • @aditya 我认为它会检查它生成的 id 是否已经存在于内存中,并在它确实存在的极少数情况下生成一个新的。这就是我在处理随机数时会做的事情。
    【解决方案4】:

    来自 Mozilla 网站:

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

    所以它是独一无二的:)

    【讨论】:

    • 对于从多个 setInterval 调用返回的值而言,它可能是唯一的,但这并不能保证对于 setTimeout 返回的值而言是唯一的。
    • "这两个函数是否有可能在运行时返回相同的值?" - 所以呃不,它们是独一无二的:)
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        • 1970-01-01
        • 2011-02-11
        • 2021-10-02
        相关资源
        最近更新 更多