手写防抖、节流,防抖和节流的区别 ?

参考回答

防抖(Debouncing)节流(Throttling) 都是用来限制频繁触发事件的技术,尤其是对频繁触发的事件如 scrollresizekeypress 等进行优化。它们的目标是提升性能,减少不必要的计算和请求。

  • 防抖:确保事件在一定时间内只触发一次。如果在规定的时间内再次触发事件,计时器会被清除并重新开始。常用于用户输入、按钮点击等场景。
  • 节流:限制一个时间周期内事件的执行次数,不管事件触发的频率有多高。常用于滚动、窗口大小调整等场景。

详细讲解与拓展

1. 防抖(Debounce)

防抖的基本思想是:只有当事件触发后一定时间内没有再触发时,才会执行某个操作。如果在这段时间内事件再次触发,计时器会被重置,直到事件停止触发一段时间才会执行。

防抖的实现:
function debounce(fn, delay) {
  let timer;
  return function(...args) {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => fn.apply(this, args), delay);
  };
}

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

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

在这个例子中,debounce 函数返回一个新的函数,只有在输入停止 500 毫秒后才会执行回调 handleInput,避免了输入过程中每次输入都触发回调。

2. 节流(Throttle)

节流的基本思想是:在指定时间内,无论事件触发多少次,都会按照一定的频率执行某个操作。常见的应用场景是滚动事件、页面的 resize 事件等。

节流的实现:
function throttle(fn, delay) {
  let lastTime = 0;
  return function(...args) {
    const now = new Date().getTime();
    if (now - lastTime >= delay) {
      lastTime = now;
      fn.apply(this, args);
    }
  };
}

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

window.addEventListener('scroll', handleScroll);

在这个例子中,throttle 函数返回一个新的函数,确保在 1000 毫秒内只会执行一次 handleScroll,即使用户快速滚动也不会频繁触发回调。

3. 防抖与节流的区别

特性 防抖(Debounce) 节流(Throttle)
触发条件 事件停止触发后才执行回调,最后一次触发才执行。 固定时间间隔内只执行一次,不管事件触发多少次。
适用场景 用于防止重复触发的场景,如输入框实时搜索、按钮点击等。 用于控制高频触发的事件,如滚动、窗口大小调整、鼠标移动等。
行为 只在最后一次事件发生后的延迟时间内触发一次。 在每次触发事件时都会执行,且执行的频率受限于指定的时间间隔。
使用方式 一般用于处理像搜索框输入等用户行为较慢、间隔较长的场景。 一般用于处理页面滚动、resize 等持续触发的事件。

4. 总结

  • 防抖 适合用户行为较为间隔的场景,避免多次重复执行操作。
  • 节流 适合高频率触发的场景,确保操作不会过于频繁地执行。

两者都能有效提高性能,减少不必要的操作,开发者根据具体场景选择合适的技术。

发表评论

后才能评论