2009-06-02 43 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)

另外在我自己的測試中,它們似乎對於這兩種瀏覽器的頁面生命週期都是唯一的。