setTimeout、setInterval、タイマーのずれ
setTimeoutとsetIntervalで単発・反復タスクをスケジュールし、タイマーのずれを減らす簡単な方法を学びます。
「setTimeout、setInterval、タイマーのずれ」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全3レッスンが含まれています。
タイマー入門
目標:処理を適切にスケジュールします。
- setTimeout:後で1回実行します
- setInterval:繰り返し実行します
- ドリフト:タイマーがずれる理由を学びます
- シンプルなドリフト対策

setTimeout — 1回だけ実行
setTimeout(fn, ms)は、遅延時間の後に1回だけ実行されます(正確な時刻ではなく、最小の待ち時間です)。
// setTimeout schedules a one-off callback
console.log("A: start");
setTimeout(function () {
console.log("B: after ~5ms");
}, 5);
console.log("C: scheduled");

setInterval — 繰り返し実行
setIntervalは自動的に繰り返し実行されます。停止するにはclearInterval(id)を使います。
// setInterval repeats; always clear it
let count = 0;
const id = setInterval(function () {
count = count + 1;
console.log("tick", count);
// Stop after 3 ticks to avoid endless logs
if (count >= 3) {
clearInterval(id);
console.log("stopped");
}
}, 5);

ドリフトを確認する
実際の間隔は一定ではありません。処理やデバイスの負荷、イベントループによってドリフトが発生します。
// Drift demo: expected vs actual timing
const targetMs = 5;
let last = Date.now();
let times = 0;
const driftId = setInterval(function () {
const now = Date.now();
const gap = now - last; // actual gap
last = now;
times = times + 1;
console.log("gap~", gap, "ms");
if (times >= 3) {
clearInterval(driftId);
console.log("done");
}
}, targetMs);

基準時刻に合わせたスケジュール
変化する予定時刻に合わせます。次の遅延時間を予定時刻から計算することで、誤差の蓄積を防ぎます。
// Simple drift fix: schedule from the expected time
const step = 5;
let expected = Date.now() + step;
let ticks = 0;
function tick() {
ticks = ticks + 1;
const now = Date.now();
const drift = now - expected; // positive if we are late
console.log("drift:", drift, "ms");
// Compute next expected time first
expected = expected + step;
// Next delay = time until the next expected timestamp
const nextDelay = Math.max(0, expected - Date.now());
if (ticks < 3) {
setTimeout(tick, nextDelay);
} else {
console.log("aligned stop");
}
}
setTimeout(tick, step);

ヒントとチェックリスト
ヒント:
- 処理が終わったら必ずclearIntervalします。
- 一定の間隔を保つには、基準時刻に合わせたsetTimeoutループを優先します。
- ドリフトを減らすため、タイマーのコールバックは短く保ちます。

ドリフト対策クイズ
簡単な確認:ドリフトの削減です。

まとめ
まとめ:1回だけ実行する処理にはsetTimeout、繰り返しにはsetIntervalを使い、必ず停止処理も行います。また、次の実行を予定時刻に合わせることでドリフトを減らしました。

よくある質問
「setTimeout、setInterval、タイマーのずれ」レッスンは無料ですか?
はい。「setTimeout、setInterval、タイマーのずれ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全3レッスンが含まれています。
「setTimeout、setInterval、タイマーのずれ」で何を学びますか?
setTimeoutとsetIntervalで単発・反復タスクをスケジュールし、タイマーのずれを減らす簡単な方法を学びます。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
JavaScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「setTimeout、setInterval、タイマーのずれ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJavaScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- setTimeout、setInterval、タイマーのずれ
- デバウンスとスロットル — 自作する
- アニメーションのタイミング — 時間ベースのループ入門