防抖节流 | 前端手写题

65 阅读1分钟

防抖节流

1.防抖(Debounce)

原理:事件触发后,等待固定时间(如 n毫秒),若期间无新触发,则执行函数;若期间再次触发,则重置计时器,重新等待

目标:确保连续操作中只执行最后一次触发

比喻:电梯等待乘客,关门倒计时15秒内若有新乘客进入,则重新倒计时,直到无人进入才运行

2.节流(Throttle)

原理:事件触发后立即执行函数,随后进入冷却期(如 n毫秒),冷却期内新触发被忽略。冷却期结束后再次触发才能执行。

目标:固定时间间隔内只执行一次操作。

比喻:电梯每15秒准时运行一次,期间无论多少人进入都无视,到点即走

防抖实现

function debounce(fn,delay){
    let timer = null;
    return function(...args){
        if(timer) clearTimeout(timer);
        timer = setTimeout(()=>{
            fn.apply(this, args);
        }, delay)
    }
}
​
// 示例:输入框实时搜索
input.addEventListener("input", debounce(search, 500));

节流实现

  // 时间戳实现
  function throttle(fn, interval) {
      let lastTime = 0;
      return function (...args) {
        const now = Date.now();
        if (now - lastTime >= interval) {
          fn.apply(this, args); // 执行函数
          lastTime = now;      // 更新最后执行时间
        }
      };
    }
    // 示例:滚动加载更多
    window.addEventListener("scroll", throttle(checkScrollPosition, 300));
​
  // 定时器实现
  function throttle(func, delay) {
      let timer = null; // 标记定时器状态
      return function (...args) {
        if (!timer) { // 若定时器未激活
          timer = setTimeout(() => {
            func.apply(this, args); // 延迟执行目标函数
            timer = null; // 重置定时器状态
          }, delay);
        }
      };
    }
    // 应用:监听窗口调整事件
    window.addEventListener("resize", throttle(handleResize, 300));

参考:一眼就能看懂的防抖和节流动画(还能学一点canvas)图: 一条竖线代表一次函数调用,函数防抖是间隔超过一定时间后才会执 - 掘金