【初心者向け】「setTimeout」と「setInterval」の違いと罠を徹底解説

JavaScriptで時間を使った処理を書こうとすると、必ず出てくるのが setTimeoutsetInterval。一見似ているこの2つ、実は使い方を間違えると 無限ループ地獄思わぬバグ にハマってしまうこともあります。

この記事では、「初心者がやりがちな勘違い」と「正しい使い分け方」「クリア(停止)の方法」まで、実例を交えてわかりやすく解説します。


🔁 まずは違いをざっくり比較

関数名処理回数実行間隔の挙動
setTimeout1回だけ指定ミリ秒後に一度だけ実行
setInterval繰り返し実行指定間隔で何度も自動で繰り返す

✅ 基本的な使い方

setTimeout

setTimeout(() => {
console.log('3秒後に一度だけ表示されるよ');
}, 3000);

上のコードは、3秒後に一度だけコンソールに表示されます。

setInterval

setInterval(() => {
console.log('2秒ごとに表示されるよ');
}, 2000);

これは2秒ごとに何度も繰り返して表示され続けます。明示的に止めない限り、ずーっと実行されます。


😱 初心者がハマりやすい「setIntervalの罠」

❌ setIntervalが止まらない問題

たとえば以下のようなコード:

setInterval(() => {
alert('こんにちは!');
}, 1000);

これを実行するとどうなるでしょう?

1秒ごとにアラートが表示され続けて、閉じても閉じてもまた表示されます。

まさに止まらない地獄。しかも setInterval の戻り値を使っていないため、停止する術がありません。


🛑 正しい止め方:clearInterval

setIntervalsetTimeout を止めるには、**戻り値(ID)**を受け取って、それを clearIntervalclearTimeout に渡します。

const intervalId = setInterval(() => {
console.log('動いてる...');
}, 1000);

// 5秒後に停止
setTimeout(() => {
clearInterval(intervalId);
console.log('止めました!');
}, 5000);

ポイント:

  • setInterval() はIDを返す → これを使わないと止められない
  • setTimeout() も同様に clearTimeout() で停止可能

🧠 実用的な使い分けのコツ

シチュエーション適した関数
アニメーション1回だけsetTimeout
カウントダウンの1秒更新setInterval
ボタンを押してから数秒後に処理開始setTimeout
APIポーリング(定期的にデータ取得)setInterval
一定間隔で処理したいけど柔軟に制御したいsetTimeout + 再帰

⛓️ 実は setTimeout のほうが柔軟なこともある?

例えば、「次の処理まで前の処理が終わるのを待ちたい」という場合、 setTimeout再帰的に呼び出すことで柔軟に制御できます。

function loop() {
console.log('処理中...');
setTimeout(loop, 1000); // 1秒ごとに再実行
}

loop(); // 最初の呼び出し

この方法なら途中で「もういいや」と止めたくなったときに フラグ を使って処理中止も簡単です。


💥 setTimeout も地味に危険な使い方

❌ 間違ったループ

for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}

期待する出力は:

0
1
2
3
4

しかし実際は 全部「5」になることがある(varを使った場合や古い文法)。

対策:let を使う or クロージャーを使う。


🧪 実例:3秒後に「推し数を更新」→ その後毎秒1回チェック

// 一度だけ3秒後に初回実行
setTimeout(() => {
updateLikes();

// 以後1秒ごとに繰り返し実行
const interval = setInterval(updateLikes, 1000);

// 30秒後に停止
setTimeout(() => clearInterval(interval), 30000);
}, 3000);

このように組み合わせて使うと、より直感的で制御しやすい処理が書けます。


🔚 まとめ:setTimeout vs setInterval

比較項目setTimeoutsetInterval
実行回数1回無限(停止しないと)
停止方法clearTimeoutclearInterval
柔軟な制御再帰的に使えば可能固定間隔で安定
おすすめ用途遅延処理・1回実行タイマー・繰り返し

✍️ 最後に一言

setInterval は一見便利に見えますが、「止め忘れたら一生走り続ける」というリスクがあります。初心者のうちは setTimeout を再帰で使ったほうが安全・柔軟でおすすめです。

タイマー処理は、アニメーション、ポーリング、ゲーム、通知など、Web開発のあらゆる場面で使われます。この2つの違いと注意点をマスターしておくことで、あなたのJavaScript力は確実に一歩上がります!

おすすめの記事