0Pricing
JavaScript Academy · レッスン

デバウンスとスロットル — 自作する

小さなデバウンスとスロットルのユーティリティを作ります。末尾実行・先頭実行のバリエーションを練習し、使い分けを学びます。

「デバウンスとスロットル — 自作する」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全3レッスンが含まれています。

概要

目標:頻繁に発生するイベントを制御します。

  • デバウンス:処理が落ち着くまで待ってから1回実行します
  • スロットル:1つの間隔につき最大1回実行します
  • leadingとtrailingの呼び出し
  • 小さく読みやすいヘルパー
デバウンスとスロットル — 自作する — イラスト1

デバウンス(trailing)

trailingデバウンスはイベントごとにタイマーをリセットし、状況が落ち着いたときに1回だけ実行します。

// Debounce (trailing): run once after events stop
function debounce(fn, wait) {
  let t = null;
  return function (...args) {
    clearTimeout(t);
    t = setTimeout(function () {
      fn.apply(null, args);
    }, wait);
  };
}

// Simulate rapid events: only the last triggers the call
const debouncedLog = debounce(function (msg) {
  console.log("debounced:", msg);
}, 10);

for (let i = 0; i < 5; i++) {
  setTimeout(function () {
    debouncedLog("final after bursts");
  }, i * 3);
}
デバウンスとスロットル — 自作する — イラスト2

デバウンス(leading)

leadingデバウンスはすぐに実行し、その後、静止期間が終わるまで繰り返しの実行を止めます。

// Debounce (leading): first call fires immediately, then ignore until quiet
function debounceLeading(fn, wait) {
  let t = null;
  return function (...args) {
    if (t === null) {
      fn.apply(null, args);
    }
    clearTimeout(t);
    t = setTimeout(function () {
      t = null;
    }, wait);
  };
}

// Demo: first call prints quickly; later bursts are ignored until quiet
const firstTap = debounceLeading(function (x) {
  console.log("leading:", x);
}, 12);

for (let i = 0; i < 4; i++) {
  setTimeout(function () {
    firstTap("first-then-wait");
  }, i * 3);
}
デバウンスとスロットル — 自作する — イラスト3

スロットル(leading)

スロットルは一定の時間枠につき1回だけ呼び出せるように制限し、余分な呼び出しを破棄します。

// Throttle (leading): at most once per interval
function throttle(fn, wait) {
  let last = 0;
  return function (...args) {
    const now = Date.now();
    if (now - last >= wait) {
      last = now;
      fn.apply(null, args);
    }
  };
}

// Demo: many events, but prints at most once every 10ms
const throttled = throttle(function (n) {
  console.log("throttled:", n);
}, 10);

for (let i = 0; i < 10; i++) {
  setTimeout(function () {
    throttled(i);
  }, i * 2);
}
デバウンスとスロットル — 自作する — イラスト4

スロットル(trailing)

trailingスロットルを使うと、時間枠の最後に最新の値も確実に取得できます。

// Throttle (trailing): schedule the last call within the window
function throttleTrailing(fn, wait) {
  let last = 0;
  let timer = null;
  let queuedArgs = null;

  function invoke(args) {
    last = Date.now();
    fn.apply(null, args);
  }

  return function (...args) {
    const now = Date.now();
    const remaining = wait - (now - last);

    if (remaining <= 0) {
      // Window passed: run now
      clearTimeout(timer);
      timer = null;
      queuedArgs = null;
      invoke(args);
    } else {
      // Queue the latest args to run at the end of the window
      queuedArgs = args;
      clearTimeout(timer);
      timer = setTimeout(function () {
        timer = null;
        if (queuedArgs) {
          invoke(queuedArgs);
          queuedArgs = null;
        }
      }, remaining);
    }
  };
}

// Demo: last value in a burst is printed after the window
const trail = throttleTrailing(function (x) {
  console.log("trail:", x);
}, 10);

for (let i = 0; i < 6; i++) {
  setTimeout(function () {
    trail("v" + i);
  }, i * 3);
}
デバウンスとスロットル — 自作する — イラスト5

どちらを使うべきか

選び方:

  • デバウンス:入力中の検索やサイズ変更など、ユーザーが操作を終えた後に実行する場合に使います。
  • スロットル:スクロールやドラッグなど、呼び出しを一定のペースに制限する場合に使います。
  • すぐに反応させるならleading、最後の値を取得するならtrailingを使います。
デバウンスとスロットル — 自作する — イラスト6

デバウンスとスロットルのクイズ

簡単な確認:時間枠ごとの呼び出し制限です。

デバウンスとスロットル — 自作する — イラスト7

まとめ

まとめ:trailingとleadingのデバウンス、シンプルなleadingスロットル、軽量なtrailingスロットルを作成しました。「ユーザーが操作を終えた後」ならデバウンス、「一定のペース」ならスロットルを選びます。

デバウンスとスロットル — 自作する — イラスト8

よくある質問

「デバウンスとスロットル — 自作する」レッスンは無料ですか?

はい。「デバウンスとスロットル — 自作する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全3レッスンが含まれています。

「デバウンスとスロットル — 自作する」で何を学びますか?

小さなデバウンスとスロットルのユーティリティを作ります。末尾実行・先頭実行のバリエーションを練習し、使い分けを学びます。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「デバウンスとスロットル — 自作する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. setTimeout、setInterval、タイマーのずれ
  2. デバウンスとスロットル — 自作する
  3. アニメーションのタイミング — 時間ベースのループ入門
← JavaScript Academyに戻る