Topiqlo ロゴ

イベントループ

公開日: 2025/06/02

イベントループとは?──非同期処理を可能にするJavaScript実行の心臓部

はじめに

JavaScript は「シングルスレッドで非同期ができる言語」として知られています。
それを実現する仕組みの中心にあるのが イベントループ(Event Loop)
非同期処理(setTimeout, Promise, async/await)がどのように制御されているのかを理解するには、イベントループのメカニズムを知ることが必須です。
本記事では、イベントループの仕組み、キューの種類、実行順序、Promiseやタイマーとの関係までを図解レベルでわかりやすく解説します。

基本情報・概要

イベントループとは、JavaScriptエンジンにおける非同期処理の実行を制御するループ機構です。
シングルスレッドであるJavaScriptが複数の処理を「同時にこなしているように見せる」基盤となります。

主な構成要素:

  • コールスタック(Call Stack)
  • タスクキュー(Task Queue / Callback Queue)
  • マイクロタスクキュー(Microtask Queue)
  • イベントループ(実行順序を調整)

イベントループは「何をいつ実行するか」を管理するエンジンの中枢です。

比較・分類・特徴の表形式まとめ(任意)

項目説明
コールスタック同期的な関数呼び出しの積み重ね(先入後出し)
タスクキューsetTimeout などの「マクロタスク」が入る
マイクロタスクキューPromise の
.then()
async/await
後の処理など
イベントループスタックが空のときにキューを監視し、処理を流し込む役割

Promise
setTimeout
より先に実行される理由は、“マイクロタスク”が先に処理される設計だからです。

深掘り解説

✅ 処理の流れ(シンプルな順序)

  1. 同期処理を実行(Call Stack に積まれる)
  2. 非同期処理はキューに登録される(setTimeout → タスクキュー、Promise → マイクロタスクキュー)
  3. Call Stack が空になると、イベントループがキューから次の処理を選ぶ
  4. まずマイクロタスクキューをすべて消化
  5. 次にタスクキューから1つ処理
  6. 再びステップ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の
    process.nextTick()
    :マイクロタスクよりも先に処理する専用API

イベントループの理解は「パフォーマンスとUXの最適化」に直結します。

よくある誤解と注意点(任意)

  • JavaScriptはマルチスレッドではない:非同期≠並列
  • async/await の中身もイベントループが処理:内部では
    Promise.then()
    と同等
  • 大量のマイクロタスクでフリーズも起こる
    while(true) await Promise.resolve()
    は危険
  • 処理の順序に依存したロジックは壊れやすい:設計上は順序に依存しすぎないことが重要

イベントループを理解せずに非同期処理を使うと、思わぬバグやパフォーマンス低下を招くことがあります。

まとめ

イベントループは、JavaScript における非同期処理の“心臓部”となる実行制御の仕組みです。
実行順序、処理の種類(マクロタスク/マイクロタスク)、スタックとキューの関係を理解することで、パフォーマンスチューニングやUI改善、堅牢な非同期設計が可能になります
ただ書くだけでなく、“いつ実行されるのか”を意識してコードを書くことが、プロフェッショナルへの第一歩です。