1

javascript のシングルスレッド性を考えると、同期イベントが発生したとき (DOM 操作など)、現在実行中の関数ブロックが中断されたときに何が起こるでしょうか? ブラウザは、中断されたブロックの実行をどこでいつ継続するかをどのように認識していますか? イベントループへの「ポインタ」の内部追加のようなものはありますか? イベント ループ内の他の待機中のイベントが、同期イベント ハンドラーの介入と実行中の元の関数ブロックの継続との間に介入できるかどうかに興味があるので、質問します。

そして、私は非同期イベント/同期イベント/イベントループの理解が非常に早いので、これが完全に間違っている場合はお知らせください. しかし、私の理解では、同期イベント (ネストされていますか?) は「すぐに発生する」ということであり、この件に関するチュートリアルからの標準的なカット アンド ペーストを使用して jsfiddle で発生するのを見てきました。非同期駆動であるため、javascriptが中断した場所をどのように/どこで取得するかをどのように知っているかについて、私は混乱しています。

スニペット:

<script>
  var button = document.body.children[0]
  var text = document.body.children[1]

  button.onclick = function() {
    alert('in onclick')

    text.focus()

    alert('out onclick')
  }

  text.onfocus = function() {
    alert('onfocus')
    text.onfocus = null  //(*)
  }
</script>

「in onclick」、「onfocus」、「out onclick」を生成します。フォーカスは同期イベントです。js は、「text.focus()」の後の次のステートメントで元に戻ることをどのように知っていますか? フレームスタックで何かが行われているのと同じくらい簡単ですか?

4

1 に答える 1

1

すべての組み込みイベントは非同期ですが、コード内で同期イベントを発生させる場合は、完了後に戻る通常の関数呼び出しのように機能します。コードの実行を突然中断するイベントはありません。開発者ツールで「実行を停止」をよく押すと、コンパイルされたコードはすべての関数とループでそのためのチェックが散らばっているため、実際には中断されます。

于 2013-07-30T00:01:19.837 に答える