防抖和节流|青训营笔记

80 阅读2分钟

2.防抖和节流**

防抖和节流是前端开发中常用的优化技术,用于限制事件处理函数的执行频率,提高页面性能和用户体验。

防抖(debounce)指的是在事件被触发 n 秒后再执行回调函数,如果在这 n 秒内又触发了事件,则重新计时。也就是说,当一个事件持续触发时,只有在停止触发一段时间后才会执行回调函数,从而减少了回调函数的执行次数。常用于搜索框输入,只有在用户停止输入一段时间后才触发搜索请求。

节流(throttle)指的是每隔一段时间执行一次回调函数。也就是说,当一个事件持续触发时,只有在指定时间间隔内执行一次回调函数,从而限制了回调函数的执行频率。常用于页面滚动、窗口大小变化等频繁触发的事件,以减少事件处理函数的执行次数。

实现防抖和节流的方法有很多,其中比较常见的是使用 setTimeout 函数和时间戳。使用 setTimeout 实现防抖和节流时,可以在事件触发后设置一个定时器,在定时器到期后执行回调函数;使用时间戳实现防抖和节流时,则可以记录上一次事件触发的时间戳,当两次事件触发的时间间隔超过指定时间时,执行回调函数。

防抖

function debounce(func, delay) {
  let timerId;
​
  return function (...args) {
    clearTimeout(timerId);
​
    timerId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
​
  };
}
​
// 使用示例
function handleInput() {
  console.log('Input debounced');
}
​
const debouncedHandleInput = debounce(handleInput, 300);
​
// 在输入框输入时触发
inputElement.addEventListener('input', debouncedHandleInput);

节流

function throttle(func, delay) {
  let isThrottled = false;
​
  return function (...args) {
    if (!isThrottled) {
      func.apply(this, args);
      isThrottled = true;
​
      setTimeout(() => {
        isThrottled = false;
      }, delay);
    }
​
  };
}
​
// 使用示例
function handleScroll() {
  console.log('Scroll throttled');
}
​
const throttledHandleScroll = throttle(handleScroll, 200);
​
// 监听滚动事件
window.addEventListener('scroll', throttledHandleScroll);