JSの実行にかかわるもの
- JavaScript エンジン
- Web APIs
- コールバックキュー
- イベントループ
JavaScriptエンジン
仕事
JSを解析→コンパイル→実行
ブラウザによって使用されているJavaScriptエンジンは異なる。
Googleであれば、V8エンジン。
JITコンパイル
プログラミング言語には、コンパイラ言語とインタプリタ言語がある。
コンパイラ言語:実行前に実行可能ファイルへと変換し、それを実行する形式。
インタプリタ言語:実行しながら評価する形式。
JavaScriptはその中間である、JITコンパイラが使用されている。
JITコンパイラは頻繁に実行されるコードや実行に時間がかかるコードをマシンコードにコンパイルする形式。
実行までの流れ
parsing
コードを解析し、AST(抽象構文木)と呼ばれるデータ構造を作成する。
compile
頻繁に実行されるコードをコンパイルする。
execute
作成したコードを実行する。
コンパイル部分はそのまま実行。
そうでない部分は評価し実行。
optimized
頻繁に実行されるコードなどコンパイルすべき部分を決定する。
Web APIs
ブラウザによって提供されているAPI。
DOMやFetch、consoleなどがある。
コールバックキュー
JavaScriptエンジンは同時に一つの処理しか実行できない。
次に処理されるものが待機する場所。
タスクキュー
- ユーザーイベント(クリック、キーボード入力など)
- setTimeoutやsetIntervalなどのタイマー
- I/O操作(ネットワークリクエスト、ファイル読み込みなど)
上記のコールバック関数のことをタスクと呼び、タスクキューに格納される。
マイクロタスクキュー
- Promiseの処理(then、catch、finally)
- MutationObserverのコールバック
- queueMicrotask関数
上記のコールバック関数をマイクロタスクと呼び、マイクロタスクキューに格納される。
上記二つのキューの違いは優先度。
マイクロタスクキューの方が高い。
イベントループとは
コールスタックが空になるたびにコールバックキューからタスクを取り出して、追加すること。