非同期イベントが「発生」する場合は、Javascriptのシングルスレッドの性質により、実際に実行される場合とは異なります。
評価されるコードの各ブロックは、タスクキュー内のタスクとして内部的に表されます。したがって、特定のコードブロックの途中で、非同期イベントが。を介して実行できるように準備されているとしsetTimeout()
ます。遅延が十分に短い場合、実際には、同じコードブロックの残りの部分の実行が終了する前に「発火」するのを止めることはできません。setTimeout
ただし、「起動」とは、ハンドラーが実際に中断して実行することを意味するものではありません。これは、タスクキューでタスクに変換されたことを意味します。実際の実行は、タスクキューからポップされるまで待機する必要があり、元のコードブロックが終了するまで実行できません。
HTML5仕様のスニペットは次のとおりです。もちろん、すべてのブラウザに対して権限があるわけではありませんが、HTML5であることは、実例です。
http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#processing-model-3
メインイベントループ用にそこで定義されている7つのステップの最初は次のとおりです。
- 関連するドキュメントが完全にアクティブではないタスクを無視して、イベントループのタスクキューの1つで最も古いタスクを実行します[...]
この最初のステップはアトミックであることに注意してください。環境がリセットされ、次のタスクが取得される前に、タスクを完了するまで実行する必要があります。
これに関するJohnResigの投稿もご覧ください:http:
//ejohn.org/blog/how-javascript-timers-work/
だから、あなたの質問を書きます:
すべての主要なブラウザーで、最初のユーザーアクションを処理するコードの後にタイムアウトのコードが実行されることを確認できますか?これは、遅延時間とは関係ありません。
...答えはイエスです、私たちは確信することができます。(バニラの場合...私たちは従来のシングル/ UIスレッドについてのみ話していると思いますが、Webワーカーによる処理については話していません)。
また、遅延時間自体はあまり気にしないとおっしゃっていましたが、それでも「クランプ時間」(強制最小遅延)にも注目することをお勧めします。これは、事実上標準化されているようです。 4ms。