JavaScript中的防抖和节流

125 阅读2分钟

在JavaScript中,防抖(Debouncing)和节流(Throttling)是两种常见的优化技术,用来控制频繁触发事件时的执行频率,避免不必要的性能开销。

1. 防抖(Debouncing)

防抖的核心思想是延迟执行,直到事件触发停止一定时间后才执行函数。如果在延迟时间内事件再次触发,之前的定时会被清除,重新计时。防抖通常用于像搜索框输入、按钮点击等场景,避免每次输入时都触发请求。

示例:防抖

function debounce(fn, delay) {
  let timer;
  return function (...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn(...args);
    }, delay);
  };
}

// 使用
const handleSearch = debounce(function (event) {
  console.log('Searching:', event.target.value);
}, 300);

document.getElementById('search-input').addEventListener('input', handleSearch);
  • 使用场景:搜索框输入、窗口大小变化(resize)、滚动事件等。
  • 效果:只有在输入停止一定时间后,才会执行相应的操作。

2. 节流(Throttling)

节流的核心思想是限制函数执行的频率,即保证在规定时间内只执行一次,不管事件触发多少次。节流通常用于滚动、窗口调整大小等频繁触发的事件,避免连续执行带来性能问题。

示例:节流

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

// 使用
const handleScroll = throttle(function () {
  console.log('Scroll event triggered');
}, 200);

window.addEventListener('scroll', handleScroll);
  • 使用场景:滚动事件、窗口大小变化(resize)、鼠标移动等。
  • 效果:无论事件触发多少次,在规定的时间内最多只执行一次。

对比

特性防抖 (Debounce)节流 (Throttle)
触发条件延迟执行,只有事件停止一定时间后才执行固定时间内只执行一次
适用场景输入框搜索、按钮点击等短时间内频繁触发滚动、窗口调整大小等高频事件
实现方式使用 setTimeout 来延迟执行使用 setTimeoutDate.now() 来控制时间间隔

总结

  • 防抖是防止一个事件被频繁触发,只有事件停止一段时间后才会执行。
  • 节流是限制一个事件在单位时间内的执行次数,避免频繁执行导致性能问题。

两者都可以用来优化性能,具体选择哪个技术,取决于事件触发的场景。