防抖和節(jié)流

防抖debounce

  • 當(dāng)事件觸發(fā)時,相應(yīng)的請求函數(shù)并不會被立即觸發(fā),而是會先等待一定的時間
  • 當(dāng)事件頻繁觸發(fā)時,請求函數(shù)的觸犯會被頻繁的推遲
  • 只有等待了一段時間也沒有事件觸發(fā),才執(zhí)行請求函數(shù)

應(yīng)用場景

  • 輸入框中頻繁的輸入內(nèi)容,搜索或者替換提交信息
  • 頻繁的點擊按鈕,觸發(fā)某個事件
  • 監(jiān)聽瀏覽器滾動事件,完成某些特定操作
  • 用戶縮放瀏覽器的 resize 事件

基本實現(xiàn)

//防抖
function debounce(fn,delay){    //fn 需要防抖的函數(shù), delay,防抖的時間期限值
    let timer = null;  //借助閉包
    return function(){
        if(timer){
            clearTimeout(timer)  //進(jìn)入該分支語句,說明當(dāng)前正在一個計時的過程中,并且又觸發(fā)了相同事件。所以要取消當(dāng)前計時,重新開始計時
        }
        else{
            timer = setTimeout(fn,delay);  //進(jìn)入該分支說明當(dāng)前并沒有計時,開始計時。
        }
    }
}

節(jié)流 throttle

  • 當(dāng)事件頻繁觸發(fā)時,相應(yīng)的請求函數(shù)在規(guī)定的執(zhí)行周期內(nèi)只觸發(fā)一次
  • 想再次觸發(fā)時,那么就只能大于設(shè)定的執(zhí)行周期后才能再次觸發(fā)

應(yīng)用場景

  • 窗口調(diào)整(resize)
  • 頁面滾動
  • dom 元素拖拽
  • 搶購瘋狂點擊

基礎(chǔ)實現(xiàn)

// 方法一:
function throttle(fn,delay){
    let valid = true
    return function(){
        if(!valid){
            return false;  //休息時間內(nèi),不執(zhí)行函數(shù)
        }
        valid = false;
        setTimeout(() => {
            fn();
            valid = false ;
        },delay)
    }
}
//方法二:
function throttle(fn,delay){
    let pre = 0;
    return function(...arg){
        let current = Date.now();
        if(current - pre >= delay){
            fn.call(this,...args);
            pre = Date.now();
        }
    }
}

總結(jié)

  • 函數(shù)防抖: 當(dāng)多事件發(fā)生時,需要發(fā)起多次的請求操作,而防抖就是將多次的請求操作合并為一次請求操作。
  • 函數(shù)節(jié)流: 當(dāng)事件多次發(fā)生時,需要發(fā)起多次請求操作,而節(jié)流就是講多次請求操作變?yōu)?strong>在規(guī)定時間間隔內(nèi)只發(fā)生一次請求操作,想要再次發(fā)生請求操作,那么要等等下一次時間間隔。
  • 防抖原理: 維護(hù)一個計時器,規(guī)定在delay時間后觸發(fā)函數(shù),但是在delay時間內(nèi)再次觸發(fā)的話,就會取消之前的計時器而重新設(shè)置,這樣就只有最后一次操作能被觸發(fā)。
  • 節(jié)流原理: 通過判斷是否到達(dá)一定時間來觸發(fā)函數(shù)。
最后編輯于
?著作權(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)容