この記事で分かること
- JavaScriptがシングルスレッドで動く仕組み
- 非同期処理とタイマーの関係
- イベントループの基本的な流れ
setTimeout(0)が遅れる理由- タイマーが正確に動かない原因の理解
JavaScriptはシングルスレッドで動作する言語です。
つまり、同時に複数の処理を実行することはできず、1つずつ順番に処理していきます。
しかし、実際には「タイマー」「通信」「イベント処理」など、同時に動いているように見える仕組みがあります。
これを実現しているのが非同期処理とイベントループです。
この記事では、タイマーがどのように非同期処理として扱われているのかを、初心者向けにわかりやすく解説します。
JavaScriptはシングルスレッドで動く
JavaScriptは1つの処理しか同時に実行できません。
そのため、重い処理があると他の処理が待たされることになります。
しかし、タイマーやイベントは「別の仕組み」で管理されているため、同時に動いているように見えます。
例:重い処理があるとタイマーが遅れる
setTimeout(() => {
console.log("タイマー実行");
}, 1000);
const start = Date.now();
while (Date.now() - start < 2000) {
// 2秒間ブロックする重い処理
}
1秒後に実行されるはずのタイマーが、実際には2秒後に実行されます。
イベントループとは?
イベントループは、JavaScriptの非同期処理を管理する仕組みです。
タイマーやイベントのコールバックは、すぐに実行されるわけではなく、キューに登録されます。
そして、メインの処理が終わったタイミングで、キューから取り出されて実行されます。
イベントループの流れ
- ①
setTimeoutなどでコールバックが登録される - ② 指定時間が経過すると「キュー」に入る
- ③ JavaScriptのメイン処理が終わるのを待つ
- ④ 空いたタイミングでコールバックが実行される
この仕組みのため、setTimeout(0) でも「すぐ」には実行されません。
setTimeout(0) が遅れる理由
setTimeout(fn, 0) は「0秒後に実行」ではなく、
「今の処理が終わったら実行」という意味になります。
console.log("A");
setTimeout(() => {
console.log("B");
}, 0);
console.log("C");
実行結果は次のようになります。
A
C
B
setTimeout はキューに入るため、メイン処理(A → C)が終わってから実行されるためです。
タイマーが正確に動かない理由
タイマーが遅れる主な原因は次のとおりです。
- JavaScriptがシングルスレッドである
- 重い処理がブロックしている
- イベントループのキューが詰まっている
正確なタイマーが必要な場合は、setTimeout を使った再帰処理が向いています。
JavaScript 初心者におすすめの学習書籍
書籍で学ぶのが向いている人
- 非同期処理やイベントループを体系的に理解したい
setTimeout/setIntervalの裏側の仕組みを知りたい- ネット記事だけだと理解が断片的に感じる
非同期処理とタイマーの関係は、JavaScript の中でも理解が難しいテーマのひとつです。
書籍では、イベントループ・コールスタック・キューなどの概念を順序立てて学べるため、仕組みを深く理解できます。
いちばんやさしい JavaScript の教本
図解が多く、JavaScript の処理の流れを視覚的に理解できる入門書です。
非同期処理の前提となる「関数」「イベント」「処理順序」が丁寧に解説されています。
この本で解決できること:
- JavaScript の処理順序を直感的に理解できる
- タイマーが遅れる理由の基礎が分かる
- 動くサンプルで理解が深まり挫折しにくい
確かな力が身につく JavaScript「超」入門
非同期処理・イベントループ・タイマーの内部動作など、より深い理解を目指す方に最適な入門書です。
setTimeout(0) が遅れる理由など、本記事の内容をさらに深く学べます。
この本で解決できること:
- 非同期処理の仕組みを体系的に理解できる
- イベントループの動作を根本から理解できる
- 現代的な JavaScript の書き方が身につく
動画で理解を深めたい方へ(Udemy講座)
非同期処理は「コードの動き」と「ブラウザ内部の処理」を同時に理解する必要があります。
動画で実際の動きを見ながら学ぶことで、イベントループやキューの仕組みが直感的に理解できます。
初心者のためのJavaScript 完全入門
setTimeout / setInterval の基礎から、非同期処理の仕組みまで丁寧に解説されている人気講座です。
本記事の内容を動画で補強したい人に最適です。
この講座で解決できること:
setTimeout(0)が遅れる理由を視覚的に理解できる- イベントループの流れを動画で学べる
- 初心者がつまずきやすいポイントを丁寧に解説
→ 初心者のためのJavaScript 完全入門(Udemy)
超JavaScript 完全ガイド 2026
非同期処理・イベントループ・タイマーの内部動作など、より深い理解を目指す方に最適な講座です。
実務レベルで非同期処理を使いこなしたい人におすすめです。
この講座で解決できること:
- 非同期処理の応用的な使い方を理解できる
- イベントループの仕組みを深く理解できる
- 現代的な JavaScript の書き方をまとめて習得
体系的に学びたい方へ(スクールという選択肢)
独学の限界を感じやすいポイント
- 非同期処理やイベントループの理解が曖昧なままになる
- タイマーが遅れる理由が説明できない
- コードレビューを受ける機会がない
- 学習の順番に自信が持てない
スクールでは、プロの講師が学習ロードマップを作成し、非同期処理のような難しいテーマも丁寧にサポートしてくれます。
無料相談で得られるメリット
- あなたのレベルに合わせた学習計画を作成
- 非同期処理の理解を深めるアドバイスがもらえる
- 効率的な学習方法をプロが提案
- エンジニア転職を視野に入れたキャリア相談も可能
JavaScript を効率よく学びたい方には、未経験からエンジニアを目指せる
DMM WEBCAMP の学習コースも選択肢のひとつです。
非同期処理とタイマーに関するよくある質問(FAQ)
setTimeout(0) がすぐに実行されないのはなぜ?
setTimeout はキューに登録され、メイン処理が終わるまで実行されないためです。
タイマーが遅れるのはバグですか?
バグではなく、JavaScriptの仕組みによるものです。重い処理があると遅れが発生します。
setInterval より setTimeout の方が正確なのはなぜ?
setTimeout は処理が終わってから次のタイマーをセットするため、ズレが蓄積しにくいからです。
非同期処理を理解するメリットは何ですか?
タイマーやイベントの動作を正しく理解でき、意図しない遅延やバグを防げるようになります。
まとめ
- JavaScriptはシングルスレッドで動作する
- タイマーはイベントループによって管理される
setTimeout(0)でもすぐには実行されない- 正確なタイマーには
setTimeout方式が向いている