防抖和節(jié)流的區(qū)別及實現(xiàn)

函數(shù)防抖(debounce):觸發(fā)高頻事件后n秒內(nèi)函數(shù)只會執(zhí)行一次,如果n秒內(nèi)高頻事件再次被觸發(fā),則重新計算時間。
函數(shù)節(jié)流(throttle):高頻事件觸發(fā),但在n秒內(nèi)只會執(zhí)行一次,所以節(jié)流會稀釋函數(shù)的執(zhí)行頻率。
函數(shù)節(jié)流(throttle)與 函數(shù)防抖(debounce)都是為了限制函數(shù)的執(zhí)行頻次,以優(yōu)化函數(shù)觸發(fā)頻率過高導致的響應速度跟不上觸發(fā)頻率,出現(xiàn)延遲,假死或卡頓的現(xiàn)象。

1、防抖(debounce)
實現(xiàn)方式:每次觸發(fā)事件時設置一個延遲調(diào)用方法,并且取消之前的延時調(diào)用方法
缺點:如果事件在規(guī)定的時間間隔內(nèi)被不斷的觸發(fā),則調(diào)用方法會被不斷的延遲
2、節(jié)流(throttle)
實現(xiàn)方式:每次觸發(fā)事件時,如果當前有等待執(zhí)行的延時函數(shù),則直接return
**防抖:將多次操作合并為一次操作進行。原理是維護一個計時器,規(guī)定在delay時間后觸發(fā)函數(shù),但是在delay時間內(nèi)再次觸發(fā)的話,就會取消之前的計時器而重新設置。這樣一來,只有最后一次操作能被觸發(fā)。
**節(jié)流:使得一定時間內(nèi)只觸發(fā)一次函數(shù)。原理是通過判斷是否有延遲調(diào)用函數(shù)未執(zhí)行。

區(qū)別:
節(jié)流不管事件觸發(fā)有多頻繁,都會保證在規(guī)定時間內(nèi)一定會執(zhí)行一次真正的事件處理函數(shù),而防抖只是在最后一次事件后才觸發(fā)一次函數(shù)。比如在頁面的無限加載場景下,我們需要用戶在滾動頁面時,每隔一段時間發(fā)一次ajax請求,而不是在用戶停下滾動頁面操作時才去請求數(shù)據(jù)。這樣的場景,就適合用節(jié)流技術來實現(xiàn)。
————————————————

/* 防抖 */
function debounce(func, delay) {
  let timer = null;
  return function () {
    if (timer) {
      clearTimeout(timer);
      timer = null;
    }
    timer = setTimeout(() => {
      func(...arguments);
    }, delay);
  };
}

/* 節(jié)流 */
function throttle(func, delay) {
  let time = null;
  return function () {
    let args = Array.from(arguments);
    if (time === null) {
      time = setTimeout(() => {
        func(...args);
        clearTimeout(time);
        time = null;
      }, delay);
    }
  };
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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