JavaScript は1本のスレッドで動き、待ち時間のある処理はキューに入れて後から実行する。
ブラウザの JavaScript は、基本的に1本のスレッド(メインスレッド)で動きます。画面の描画やクリックの処理も同じスレッドなので、通信やタイマーの待ち時間にスレッドを止めないよう、「終わったら後で呼んでね」とキューに入れる仕組みになっています。この順番を回すのがイベントループです。
| しくみ | 入るもの |
|---|---|
| コールスタック | いま実行中の関数。空になるまで他は動かない |
| マイクロタスクキュー | Promise の then・await の続き、queueMicrotask |
| タスクキュー | setTimeout・クリックなどのイベント・通信の完了 |
順番は「スタックが空になる → マイクロタスクを全部実行 → 必要なら描画 → タスクを1つ実行 → またマイクロタスクを全部…」です。
console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);
// 出力:1 4 3 2面接ではこう答える
ブラウザの JavaScript は1本のメインスレッドで動き、描画やクリックの処理も同じスレッドで行います。待ち時間のある処理は、終わったら呼んでもらうようにキューに入れ、イベントループが順番に取り出して実行します。順番は、コールスタックが空になったらマイクロタスクを全部、必要なら描画、そしてタスクを1つ、の繰り返しです。だから Promise の then は setTimeout より先に動きます。
Webとの関わり非同期のバグや、画面が固まる問題の原因を説明するときの基礎です。