LoginSignup
2
2

JavaScript のデバウンス、完全に理解した

Last updated at Posted at 2024-02-20

JavaScript の世には デバウンス(debounce)スロットル(throttle) という便利な手法があることを最近知りました。

「これを知らずに今まで開発していたなんて…あの時のロジックもっと簡単に書けたやん」と今悶えています。

残念ながら弊社エンジニアは誰も知らない可能性が高いので、メモして共有するため記事にしました。

スロットルの記事はこちら

デバウンス (debounce)

同じイベントが連続して発火するような状況で、発火した回数分処理を実行すると負荷が高くなってしまう場合に、途中のイベント処理は実行せず、最後のイベント発火から指定した秒数待った後に処理を実行する手法。

例えばサイトでフォームの値を入力後にイベントを発火させたいが、ユーザーが連続して入力する場合は入力完了を待ちたいという場合に使えますね。

雑なサンプルコード

'test-debounce' という id を持つボタンがあり、最後にクリックしてから1秒後に 'Click Event Called' という文字列と現在日時とコンソールに出力する。1秒経過前に再度クリックが発生した場合は、その前の処理は実行されない。

/**
 * @param {Function} anonymousFunction 遅延実行される無名関数
 * @param {number} delay 遅延時間(ms)
 * @returns
 */
function debounce(anonymousFunction, delay)
{
    let inDebounce;
    return function() {
        const context = this;
        const args = arguments;
        clearTimeout(inDebounce);
        inDebounce = setTimeout(() => anonymousFunction.apply(context, args), delay);
    }
}

/**
 * 1秒後に 'Click Event Called' という文字列と現在日時を console に出力する
 */
const clickEvent = debounce(function() {
    console.log('Click Event Called');
    console.log(new Date());
}, 1000);

/**
 * ページロード後、id が test-debounce の要素に対して click イベントリスナーを追加
 */
window.addEventListener('load', function() {
    document.getElementById('test-debounce').addEventListener('click', clickEvent);
});

samplecode.png

感想

めっちゃ便利。もっと早く知りたかった。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2