什麼是防抖和節流?有什麼區別?如何實現?

什麼是防抖和節流?有什麼區別?如何實現?

防抖

觸發高頻事件後 n 秒內函數只會執行一次,如果 n 秒內高頻事件再次被觸發,則重新計算時間

思路:

每次觸發事件時都取消之前的延時調用方法

function debounce(fn, delay = 300) {
  let timeout; // 創建一個標記用來存放定時器的返回值
  return function(...arg) {
    clearTimeout(timeout); // 每當用戶輸入的時候把前一個 setTimeout clear 掉
    timeout = setTimeout(() => {
      // 然後又創建一個新的 setTimeout, 這樣就能保證輸入字符後的 interval 間隔內如果還有字符輸入的話,就不會執行 fn 函數
      fn.apply(this, arg);
    }, delay);
  };
}

節流

高頻事件觸發,但在 n 秒內只會執行一次,所以節流會稀釋函數的執行頻率

思路:

每次觸發事件時都判斷當前是否有等待執行的延時函數

基於定時器實現節流函數

function throttle(fn, delay = 300) {
  let timer;
  return function(...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args); // 當函數執行過後才能設置下次定時器
        timer = null;
      }, delay);
    }
  };
}

基於時間實現節流函數

function throttle(fn, delay = 300) {
  let preTime = Date.now();
  return function(...args) {
    let lastTime = Date.now();
    if (lastTime - preTime >= delay) {
      fn.apply(this, args);
      preTime = Date.now();
    }
  };
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章