私はブラウザの内部実行戦略をよく知らないため、この記事ではいくつかのフロントエンド テストを通じて結論を漠然と推測することしかできません。
1) テスト例
2 つの例を作成しました。 :
1 -1) スクリプトはページ内で直接実行され、更新することで結果を確認できます
テスト結果:
IE ブラウザのさまざまなバージョンで、取得されるアラート結果は一般的に次のとおりです。 5 以降、場合によっては大きな値があります。
Chrome19、基本的に 2、場合によっては 3
Firefox12、基本的に 1、0、2、ただし時々 13 前後の値があります
Safari5.1、基本的に 1、たまに 2 と 3
Opera11.5、基本的に 4,3,、ですが、時々 12 前後の値があります。
上記のテストは、複雑なページまたは単一のタブを妨げる複数のタブを開いたときに実行されました。結果も同様です。
2) それはどういう意味ですか?
実際には結論は出せませんが、テスト結果は基本的に、現在人気のあるブラウザーにおける JS スクリプトの効率ランキングを反映しています。
理由を調査すると、次のような確認が得られる可能性があります。
2-1) js のメイン実行スレッドはシングルスレッドであるため、この値は通常 0 より大きい必要があり、setTimeout の実行時点はちょうどjs のメイン実行キューに追加 実行される時点は、順番に実行される js エンジン スレッドのキューによって決まります。この結論は多くの場所で述べられています。自分で確認することができます (例:
JavaScript はマルチスレッド化できますか? JavaScript のタイミングメカニズムについての深い理解
)。この結論は、アニメーションの作成に setTimeout が使用される理由も裏付けています。人気が高いとスムーズではありません。 ちなみに、問題を説明するためにバックライトの写真をここに掲載します:
3-2) テスト時に大きな値が発生する場合がありますが、これは GC など、JS のメイン実行スレッドで行われている他の処理が原因である可能性があります。大きな値が繰り返される可能性は非常に低いためです。 要約: 実際のところ、私は結論に達していません。私はただ好奇心と推測をして、起こり得る状況と結果を見てみたいと思っています。皆さんが私を批判して修正してくれることを願っています。あるいは決定的な答えを教えてください。
さらに: setTimout 関数の 2 番目のパラメーターが負の数値の場合、0 と同じ効果があります。 setTimeout(function(){console.log('test')},-100); の場合は、 setTimeout(function (){console.log('test')},0) に設定します。
エラーが報告されるだろうと思っていましたが、どのブラウザもエラーを報告しませんでした。