43

2つの質問:

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

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

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

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

最初の質問は私の知識のための質問ですが、2番目の質問はもっと重要です。

4

6 に答える 6

38

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

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

これをOpera9、Safari 3、Firefox 3、IE7でテストしました。

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

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

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

于 2009-06-02T15:27:50.277 に答える
7

私はそれが標準化された行動ではないと思います。setTimeoutFirefoxでは、これは単なる整数であり、またはの呼び出しごとに増分しますsetInterval。そして、いいえ、それらは同じ値を持つことはできません。

于 2009-06-02T15:14:17.213 に答える
3

MozillaのWebサイトから:

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

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

于 2009-06-02T15:13:55.233 に答える
2

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

于 2009-06-02T15:24:40.203 に答える
0

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

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

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

于 2014-03-05T16:52:27.067 に答える