イベントループ
公開日: 2025/06/02
イベントループとは?──非同期処理を可能にするJavaScript実行の心臓部
はじめに
JavaScript は「シングルスレッドで非同期ができる言語」として知られています。
それを実現する仕組みの中心にあるのが イベントループ(Event Loop)。
非同期処理(setTimeout, Promise, async/await)がどのように制御されているのかを理解するには、イベントループのメカニズムを知ることが必須です。
本記事では、イベントループの仕組み、キューの種類、実行順序、Promiseやタイマーとの関係までを図解レベルでわかりやすく解説します。
基本情報・概要
イベントループとは、JavaScriptエンジンにおける非同期処理の実行を制御するループ機構です。
シングルスレッドであるJavaScriptが複数の処理を「同時にこなしているように見せる」基盤となります。
主な構成要素:
- コールスタック(Call Stack)
- タスクキュー(Task Queue / Callback Queue)
- マイクロタスクキュー(Microtask Queue)
- イベントループ(実行順序を調整)
イベントループは「何をいつ実行するか」を管理するエンジンの中枢です。
比較・分類・特徴の表形式まとめ(任意)
項目 | 説明 |
---|---|
コールスタック | 同期的な関数呼び出しの積み重ね(先入後出し) |
タスクキュー | setTimeout などの「マクロタスク」が入る |
マイクロタスクキュー | Promise の や 後の処理など |
イベントループ | スタックが空のときにキューを監視し、処理を流し込む役割 |
Promise
が setTimeout
より先に実行される理由は、“マイクロタスク”が先に処理される設計だからです。
深掘り解説
✅ 処理の流れ(シンプルな順序)
- 同期処理を実行(Call Stack に積まれる)
- 非同期処理はキューに登録される(setTimeout → タスクキュー、Promise → マイクロタスクキュー)
- Call Stack が空になると、イベントループがキューから次の処理を選ぶ
- まずマイクロタスクキューをすべて消化
- 次にタスクキューから1つ処理
- 再びステップ3からループ
✅ 実行順序の例
console.log('A'); setTimeout(() => { console.log('B'); // マクロタスク }, 0); Promise.resolve().then(() => { console.log('C'); // マイクロタスク }); console.log('D');
実行結果:
A D C B
- 同期 → マイクロタスク(C)→ マクロタスク(B)の順
応用・発展的な使い方
- 非同期制御のチューニング:重い処理は
で後回しにsetTimeout(fn, 0)
- UI描画をブロックしないロジック:マイクロタスクを意識した設計が有効
- イベント駆動アーキテクチャ:Node.js やブラウザのイベントモデルを理解する鍵
- Node.jsの
:マイクロタスクよりも先に処理する専用APIprocess.nextTick()
イベントループの理解は「パフォーマンスとUXの最適化」に直結します。
よくある誤解と注意点(任意)
- JavaScriptはマルチスレッドではない:非同期≠並列
- async/await の中身もイベントループが処理:内部では
と同等Promise.then()
- 大量のマイクロタスクでフリーズも起こる:
は危険while(true) await Promise.resolve()
- 処理の順序に依存したロジックは壊れやすい:設計上は順序に依存しすぎないことが重要
イベントループを理解せずに非同期処理を使うと、思わぬバグやパフォーマンス低下を招くことがあります。
まとめ
イベントループは、JavaScript における非同期処理の“心臓部”となる実行制御の仕組みです。
実行順序、処理の種類(マクロタスク/マイクロタスク)、スタックとキューの関係を理解することで、パフォーマンスチューニングやUI改善、堅牢な非同期設計が可能になります。
ただ書くだけでなく、“いつ実行されるのか”を意識してコードを書くことが、プロフェッショナルへの第一歩です。