js中的防抖和節(jié)流

防抖(debounce):一段時間之后才執(zhí)行某個函數(shù)
節(jié)流(throttle):一段時間之內(nèi)執(zhí)行某個函數(shù)

防抖(debounce): 主要是利用計時器實現(xiàn);為了不污染全局變量,利用閉包,共享一個計時器變量,返回一個新的函數(shù)

myPlugin.debounce = function (callback, time) {
    var timer;
    return function () {
        clearTimeout(timer);//清除之前的計時
        timer = setTimeout(function () {
            callback();
        }, time);
    }
}

完善一下如果要傳入?yún)?shù)的情況

myPlugin.debounce = function (callback, time) {
    var timer;
    return function () {
        clearTimeout(timer);//清除之前的計時
        var args = arguments; //利用閉包保存參數(shù)數(shù)組
        timer = setTimeout(function () {
            callback.apply(null, args);
        }, time);
    }
}

如何使用

   <script src="debounce的js路徑"></script>
    <script>
        var handle = myPlugin.debounce(function(width) {
            console.log(width);
        }, 1000);
        window.onresize = function() {
            handle(document.documentElement.clientWidth);
        }
    </script>

節(jié)流(throttle): 節(jié)流有兩種做法,一種是利用計時器,等某段時候之后才執(zhí)行并且在在段時間內(nèi)不回重新計時;另外一種是利用時間戳,該立即執(zhí)行,下一次執(zhí)行需要等待

第一種方法

myPlugin.throttle = function (callback, time) {
    var timer;
    return function () {
        // 如果當(dāng)前有計時,直接renturn
        if (timer) {
            return;
        }
        var args = arguments; //利用閉包保存參數(shù)數(shù)組
        timer = setTimeout(function () {
            callback.apply(null, args);
            timer = null; //函數(shù)執(zhí)行完要立馬清空計時器,否則將無法進(jìn)行下一次執(zhí)行
        }, time);
    }
}

第二種方法

myPlugin.throttle = function (callback, time) {
    var t;
    return function () {
        if (!t || Date.now() - t >= time) { //之前沒有計時 或 距離上次執(zhí)行的時間已超過規(guī)定的值
            callback.apply(null, arguments);
            t = Date.now(); //得到的當(dāng)前時間戳
        }
    }
}

所以我們可以統(tǒng)一一下

myPlugin.throttle = function (callback, time, immediately) {
    if (immediately === undefined) {
        immediately = true;
    }
    if (immediately) {
        var t;
        return function () {
            if (immediately) {
                if (!t || Date.now() - t >= time) { //之前沒有計時 或 距離上次執(zhí)行的時間已超過規(guī)定的值
                    callback.apply(null, arguments);
                    t = Date.now(); //得到的當(dāng)前時間戳
                }
            }
        }
    }
    else {
        var timer;
        return function () {
            // 如果當(dāng)前有計時,直接renturn
            if (timer) {
                return;
            }
            var args = arguments; //利用閉包保存參數(shù)數(shù)組
            timer = setTimeout(function () {
                callback.apply(null, args);
                timer = null; //函數(shù)執(zhí)行完要立馬清空計時器,否則將無法進(jìn)行下一次執(zhí)行
            }, time);
        }
    }
}

如何使用

    <script>
        function test() {
            console.log("a");
        }
        var handle = myPlugin.throttle(test, 1000, false);
        window.onresize = function(){
            handle();
        }
    </script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容