防抖與節(jié)流

防抖

防抖函數(shù)是指一定時間內(nèi),事件被頻繁觸發(fā),但只執(zhí)行一次。

應(yīng)用場景:

  1. input 輸入搜索時,當(dāng)用戶停止輸入的時候才驗證,節(jié)約 ajax 請求
  2. 滾動條滾動,窗口變化的時候,觸發(fā)事件

示例:

// 簡單的防抖動函數(shù)
function debounce(func, wait, immediate) {
  let timeout; // 定時器
  return function () {
    clearTimeout(timeout); // 每次觸發(fā) scroll handler 時先清除定時器
    timeout = setTimeout(func, wait); // 真正想進行的操作 handler
  };
}
// 實際想綁定在 scroll 事件上的 handler
function realFunc() {
  console.log("Success");
}
// 采用了防抖動
window.addEventListener("scroll", debounce(realFunc, 1000));
// 沒采用防抖動
window.addEventListener("scroll", realFunc);


節(jié)流

節(jié)流函數(shù)是指一定時間內(nèi)方法只執(zhí)行一次。

應(yīng)用場景:

  1. 鼠標(biāo)不斷點擊觸發(fā),mousedown(單位時間內(nèi)只觸發(fā)一次)
  2. 上拉、觸底加載更多

示例:

function throttle(fn, delay) {
  let last = 0, // last為上一次觸發(fā)回調(diào)的時間
    timer: any = null; // timer是定時器
  return function () {
    let context = this; // 保留調(diào)用時的this上下文
    let args = arguments; // 保留調(diào)用時傳入的參數(shù)
    let now = +new Date(); // 記錄本次觸發(fā)回調(diào)的時間
    // 判斷上次觸發(fā)的時間和本次觸發(fā)的時間差是否小于時間間隔的閾值
    if (now - last < delay) {
      // 如果時間間隔小于我們設(shè)定的時間間隔閾值
      // 則為本次觸發(fā)操作設(shè)立一個新的定時器
      clearTimeout(timer);
      timer = setTimeout(function () {
        last = now;
        fn.apply(context, args);
      }, delay);
    } else {
      // 如果時間間隔超出了我們設(shè)定的時間間隔閾值
      // 那就不等了,無論如何要反饋一次響應(yīng)
      last = now;
      fn.apply(context, args);
    }
  };
}
// 實際想綁定在 scroll 事件上的 handler
function realFunc() {
  console.log("Success");
}
// 采用了節(jié)流
window.addEventListener("scroll", throttle(realFunc, 1000));
// 沒采用節(jié)流
window.addEventListener("scroll", realFunc);
?著作權(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)容