请描述防抖和节流,并用封装成函数

53 阅读1分钟

防抖(Debounce)和节流(Throttle)是两种常用的优化前端性能的技术。

防抖:当事件被触发后,延迟一段时间执行回调函数,如果在这段时间内又触发了该事件,则重新计时。适用于频繁触发的事件,如窗口大小调整、输入框输入等,可以减少回调函数的执行次数。

节流:当事件被触发后,每隔一段时间执行一次回调函数。适用于高频率触发的事件,如滚动事件、鼠标移动事件等,可以限制回调函数的执行频率。

以下是防抖和节流的示例代码:

// 防抖函数
function debounce(func, delay) {
  let timer;
  
  return function() {
    clearTimeout(timer);
    
    timer = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  }
}

// 节流函数
function throttle(func, delay) {
  let timer;
  
  return function() {
    if (!timer) {
      timer = setTimeout(() => {
        func.apply(this, arguments);
        timer = null;
      }, delay);
    }
  }
}

在上面的示例中,我们分别定义了 debouncethrottle 函数,它们接受一个回调函数 func 和一个延迟时间 delay

debounce 函数使用了闭包来保存一个定时器 timer,在每次触发事件时,先清除之前的定时器,然后重新设置一个新的定时器。当定时器触发时,执行回调函数。

throttle 函数也使用了闭包来保存一个定时器 timer,在每次触发事件时,如果定时器不存在,则设置一个新的定时器,并在定时器触发时执行回调函数。当回调函数执行完成后,将定时器置为 null

通过使用这两个函数,我们可以对特定的事件进行防抖或节流处理,以优化性能并控制回调函数的执行频率。