web-dev-qa-db-ja.com

setInterval / setTimeoutの戻り値

2つの質問:

  1. setIntervalおよびsetTimeout(タイマーのクリアに使用されるもの)から返される値はどのように計算されますか?

  2. 実行時に両方の関数が同じ値を返すことは可能ですか?例えば:

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

abが同じ値を持つことは可能ですか?

最初の質問は私の知識の質問ですが、2番目の質問はより重要です。

38
aditya

タイマーをキャンセルするために使用できる値を返します。 したがって、同じ値を返す可能性は低いようです(値を再利用していて、タイマーの1つが既にキャンセルされている場合を除く)

MozillaはDOMレベル0であると述べていますが、仕様の一部ではありません。 (ページの下部を見てください)

さらに良いリファレンスがあります:

ナブル 言う:

SetTimeoutとsetIntervalは、元のJavascript仕様であるECMA以前のものです。その仕様はどこでも公式に標準化されていませんが、すべてのWebブラウザーとJavascript言語のほとんどの実装でサポートされています。 (ActionScriptを含む。)

ECMA以前の仕様は、多くの場合「DOM-0」APIとして知られています。以前に標準化されたことがないため、HTML5が最終的に非推奨APIを仕様化して、ブラウザー間で一貫した環境を提供することは理にかなっています。特に最近の出来事で、基準ではなく精神を実装したい企業が存在することが証明されたとき。

元の仕様を読む here 、または Sun (JavaScriptの早期推奨者)から。

35
cgp

これをOpera 9、Safari 3、Firefox 3およびIE 7。

1から始まり、setTimeOut()およびsetInterval()の呼び出しごとに1ずつ増加するすべての整数値を返しました。しかし、ブラウザーがカウンターを開始し、それらを異なる方法で処理していることに気付きました。

  • IEは(一見)ランダムな6桁の数字で始まりましたが、その後のいずれかの関数の呼び出しでこの数字が増加しました。閉じて再度開いた後、IE前のセッションのカウントに近いところにないため、開始番号がランダムに生成されているように見えました。
  • Operaはタブごとにカウンターを維持しました-タブを閉じて新しいタブを開くと、新しいタブの1からカウンターが開始されました。
  • Safariでは、カウントはグローバルでした-新しいタブを開いて異なるタブで関数を呼び出すと、グローバル参照カウンターが増加するように見えました。
  • Firefoxでは、カウンターは2から開始するように見え、以降のいずれかの関数の呼び出しで増加します。 Operaと同様に、各タブには独自のカウンター値がありましたが、すべて2から始まります。

ただし、すべてのシナリオで、(少なくとも同じタブにある)2つの識別子が同じではないことに注意してください。

32
Alex Rozanski

標準化された動作ではないと思います。 firefoxでは、これは単なる整数であり、setTimeoutまたはsetIntervalの呼び出しごとに増加します。そして、いや、彼らは同じ価値を持つことはできません。

6

Mozilla Webサイトから:

intervalIDは、clearInterval()に渡すことができる一意の間隔IDです。

だからそれはユニークです:)

2
Ropstah

同じ値を持つことができるかどうかは、JavaScriptの実装に依存します。 FirefoxでMaciejが言及したように、同じカウンターが使用されるため、同じ値を持つことはできません。ただし、他のブラウザでは異なる可能性があるため、同じ値を持たないブラウザに依存しないことをお勧めします。

1
Mario Menger

返される値は、内部で保持しているタイマー/間隔のリストのインデックス値であるように思えます。

ポイントとして、clearInterval(var_returned_from_set)の代わりにclearInterval(18)を呼び出し、目的のタイマー/間隔を停止しました。 (FF17.0.1およびIE9.0.8のテスト済み)

また、私自身のテストでは、それらは両方のブラウザーのページの存続期間中に一意であるように見えます。

0
Plater