javascriptで、スクロールイベント完了後に1回だけ処理を走らせたい

たまに使う頃に忘れてるのでメモ

let scrollTimer;
let flag = 0;
    
window.onscroll = () => {
    flag = 1;
    ~スクロール中に走らせたい処理~

    clearTimeout(scrollTimer);

    scrollTimer = setTimeout(() => {
        if(flag === 1) {
            flag = 0;
            ~スクロール完了後に走らせたい処理~
        }
    }, 250);
}

解説

このコードはスクロールをしてから250ミリ秒後に、setTimeout内の処理が走ります。
window.onscrollは、画面がほんの僅かでもスクロールされると発火するので、スクロール中は何度も発火している事になります。
従って、setTimeoutもその度に発火するので、スクロール完了後の処理を1回だけ走らせるための工夫を加えてあります。

let scrollTimer;
スクロールイベントが発生した後に遅延を管理するためのタイマーIDが格納される変数です
let flag = 0;
現在スクロール中かどうかを示すフラグです
window.onscroll
スクロールをするとonscroll関数が走ります
flag = 1;
スクロール中は常にflagに1が代入され続けます
このコードの直後に、スクロール中の処理を書きます
clearTimeout(scrollTimer);
例えば250ミリ秒の間にwindow.onscrollが5回発火したとすると、setTimeoutも5回走る事になるため、都度、処理待機状態にあるsetTimeoutをクリアし、新たにsetTimeoutを走っても処理が重ならない様にするための関数です
scrollTimer = setTimeout(()
scrollTimer変数に遅延管理のタイマーIDを格納しています
if(flag === 1)
flagに1が代入されているかどうかの判定
flag = 0;
flagが1の時に0を代入し、このコードの直後に、スクロール完了後の処理を書きます
}, 250);
setTimeoutを250ミリ秒後に処理する