ブラウザーが JavaScript イベントを処理する方法について少し混乱しています。
ボタン A と B に 2 つのイベント ハンドラーが関連付けられているとします。両方のイベント ハンドラーが完了するまでにまったく同じ時間がかかります。ボタン A を最初にクリックし、次にボタン B をクリックすると、ボタン A のイベント ハンドラが常に最初に実行される(イベント ループが FIFO キューであるため) というのは本当ですか? もしそうなら、実際にこの順序を決定するものは何ですか?
ブラウザーが JavaScript イベントを処理する方法について少し混乱しています。
ボタン A と B に 2 つのイベント ハンドラーが関連付けられているとします。両方のイベント ハンドラーが完了するまでにまったく同じ時間がかかります。ボタン A を最初にクリックし、次にボタン B をクリックすると、ボタン A のイベント ハンドラが常に最初に実行される(イベント ループが FIFO キューであるため) というのは本当ですか? もしそうなら、実際にこの順序を決定するものは何ですか?
はい。実行されるイベント ハンドラーの順序は保証されており、実際にはオーバーラップしません。
これは、同時実行モデルとしてのイベント ループの優れた点です。ほとんどの場合、 (常にではありませんが)デッドロック、ライブロック、競合状態などのスレッドの問題について考える必要はありません。
実行の順序は単純で、ブラウザの JavaScript はほとんどの場合シングル スレッドであり、実際には実行の順序を気にする必要はありません。
ただし、マウス イベントの順序が保証されているという事実は、JavaScript とはほとんど関係ありません。これは JavaScript 言語の一部ではなく、DOM APIと呼ばれるものの一部です。DOM (ドキュメント オブジェクト モデル) は、JavaScript がブラウザーや作成した HTML と対話する方法です。
ホスト オブジェクトと呼ばれるものは、ブラウザー内の JS が動作する外部オブジェクトとして JavaScript 仕様で定義されており、この場合の動作は DOM API で指定されています。
順序 DOM イベントが登録されるかどうかが保証されるかどうかは、JavaScript の一部ではなく、その API の一部です。より具体的には、ここで定義されています。したがって、あなたの質問に: はい、評価の順序を台無しにする可能性のあるコントロール キー ((control alt delete) など) を除いて、イベントの実行順序は特定されます。
Javascript エンジンはシングル スレッドです。すべてのイベント ハンドラーは順番に発生します。A のクリック ハンドラーが呼び出され、 B のハンドラーが開始される前に終了します。これは、1 つのハンドラーでsleep()
ingを実行し、最初のハンドラーが終了するまで 2 番目のハンドラーが開始されないことを確認することで確認できます。
setTimeout
は、後でコールバックされるように関数をエンジンに登録するため、このテストには有効ではないことに注意してください。setTimeout
すぐに戻ります。
このフィドルは、この動作を示す必要があります。
コマンドは、javascript によって実行されると、実際には FIFO にあります。ただし、ハンドラーが結果を送信するのに異なる時間がかかる場合があります。この場合、ハンドラー B からの応答が早く返され、ハンドラー A からの応答が遅くなる可能性があります。