返回

茶余饭后轻松聊聊手写防抖和节流

前端

前言

防抖和节流是两个前端开发中常用的技术,它们可以帮助我们优化页面的性能,提高用户体验。防抖可以防止函数被频繁调用,而节流可以限制函数在一定时间内只被调用一次。

基本概念

防抖

防抖(debounce)是一种函数装饰器,它可以防止函数在一定时间内被重复调用。当函数被调用时,防抖函数会启动一个计时器。如果在计时器到期之前函数又被调用,那么计时器会被重置。只有在计时器到期后,函数才会被实际调用。

节流

节流(throttle)也是一种函数装饰器,它可以限制函数在一定时间内只被调用一次。当函数被调用时,节流函数会立即执行一次函数。如果在函数执行期间函数又被调用,那么这些调用会被忽略。只有在函数执行完毕后,节流函数才会允许函数再次被调用。

实现方式

防抖

防抖函数的实现方式有很多种,最简单的一种是使用 setTimeout 函数。

function debounce(func, wait) {
  let timer;
  return function () {
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(context, args);
    }, wait);
  };
}

节流

节流函数的实现方式也有很多种,最简单的一种是使用 setInterval 函数。

function throttle(func, wait) {
  let lastCallTime = 0;
  return function () {
    const context = this;
    const args = arguments;
    const now = Date.now();
    if (now - lastCallTime > wait) {
      func.apply(context, args);
      lastCallTime = now;
    }
  };
}

优缺点

防抖

防抖的优点是它可以防止函数被频繁调用,从而提高性能。防抖的缺点是它可能会导致函数在用户操作之后有一段延迟才被执行,这可能会影响用户体验。

节流

节流的优点是它可以限制函数在一定时间内只被调用一次,从而提高性能。节流的缺点是它可能会导致函数在用户操作期间被忽略,这可能会影响用户体验。

应用场景

防抖

防抖通常用于处理用户输入事件,比如表单输入、搜索框输入等。防抖可以防止这些事件被频繁触发,从而提高性能。

节流

节流通常用于处理窗口滚动事件、窗口调整大小事件等。节流可以限制这些事件在一定时间内只被触发一次,从而提高性能。

建议

在使用防抖和节流技术时,需要注意以下几点:

  • 选择合适的等待时间。等待时间太短可能会导致函数被频繁调用,而等待时间太长可能会导致函数在用户操作之后有一段延迟才被执行。
  • 考虑用户体验。防抖和节流可能会导致函数在用户操作之后有一段延迟才被执行,这可能会影响用户体验。因此,在使用防抖和节流技术时,需要权衡性能和用户体验。
  • 使用合理的实现方式。防抖和节流的实现方式有很多种,需要根据实际情况选择合适的实现方式。