防抖和节流

45 阅读1分钟

老生常谈的东西,但今天突然顿悟!又非常直观!一改以往绕来绕去只能记几天的情况

想忘都很难,喜出望外🎉

一、理解

(一) 防抖(Debounce)

理解为防止抖动,对标物理学的“抖动”或“震动”,(脑子里可以想象有一个钟摆)比如:

  • 当你按下一个按钮,类似于“抖动”;
  • 当你发疯一样多次按下按钮,就产生了多个快速、重复的抖动;

防抖的目的就是消除这些多余的抖动,让操作只在最后一次抖动停止后执行一次(1s的防抖 = 等钟摆停止抖动 1s 后执行)。

(二) 节流(Throttle)

对标物理学中的节流阀(throttle valve):用于控制液体或气体流量,让流量保持在一个可控范围内,不会太快。

节流函数就像“加上节流阀”,限制事件触发的频率,确保在一定时间内只执行一次函数

二、时间图

三、代码实现

(一) 防抖

function debounce(fn, delay) {
  let timer;
  return function(...args) {
    clearTimeout(timer); // 清除上一次的定时器
    timer = setTimeout(() => {
      fn(...args); // 在延迟时间后执行函数
    }, delay);
  };
}

// 示例
const handleInput = debounce((event) => {
  console.log('Input event: ', event.target.value);
}, 500);

document.querySelector('input').addEventListener('input', handleInput);

(二) 节流

function throttle(fn, delay) {
  let lastTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= delay) {
      fn(...args);
      lastTime = now;
    }
  };
}

// 示例
const handleScroll = throttle(() => {
  console.log('Scroll event');
}, 1000);

window.addEventListener('scroll', handleScroll);

四、总结

  • 防抖(Debounce) → 消除“抖动”,只在动作停止后触发
  • 节流(Throttle) → 控制“流量”,按固定频率触发