Skip to content

JS-防抖与节流

当前字数: 0 字 阅读时长: 0 分钟

防抖(Debounce)和节流(Throttle)是两种常见的性能优化技术,它们主要用于控制高频率事件的触发,以提高应用的响应速度和用户体验。

防抖(Debounce)

n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时。

  • 防抖技术的核心思想是:对于频繁触发的事件,只在最后一次事件触发后的指定时间内没有再次触发事件时,才执行回调函数。这样可以避免在短时间内多次执行回调函数,从而减轻性能负担。

  • 举个例子,当用户在一个输入框中快速输入文字时,如果我们希望只有在用户停止输入一段时间后才进行搜索或验证,就可以使用防抖。

代码实现

  • 普通防抖函数

js
function debounce(func, delay) {
  let timeout;
  return function () {
    let arg = arguments;
    if (timeout) clearTimeout(timeout);
    timeout = setTimeout(() => {
      func(arg);
    }, delay);
  };
}
  • 立即执行防抖函数

js
function debounce(fn, delay) {
  let timer;

  return function () {
    let args = arguments;
    if (timer) clearTimeout(timer);

    let callNow = !timer;
    timer = setTimeout(() => {
      timer = null;
    }, delay);
    if (callNow) {
      fn(args);
    }
  };
}
  • 普通防抖+立即执行

js
function debounce(fn, delay, immediate) {
  let timer;

  return function () {
    let args = arguments;
    let _this = this;
    if (timer) clearTimeout(timer);

    if (immediate) {
      let callNow = !timer;
      timer = setTimeout(() => {
        timer = null;
      }, delay);

      if (callNow) {
        fn.apply(_this, args);
      }
    } else {
      timeout = setTimeout(() => {
        func.apply(_this, arguments);
      }, delay);
    }
  };
}

节流(Throttle)

n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效。

  • 节流技术的核心思想是:对于频繁触发的事件,规定在一段时间内只能执行一次回调函数,无论这段时间内事件被触发了多少次。这样可以确保回调函数以固定的频率执行,避免过于频繁的操作。

  • 例如,在滚动事件中,我们可能希望每隔一段时间(比如 200 毫秒)才更新一次页面上的某些内容,而不是每次滚动都更新。这时,节流就非常有用。

代码实现

  • 节流函数-定时器

js
function throttle(fn, wait) {
  let timer;
  return function () {
    let _this = this;
    let args = arguments;
    if (!timer) {
      timer = setTimeout(() => {
        timer = null;
        fn.apply(_this, arguments);
      }, wait);
    }
  };
}
  • 节流函数-时间戳

js
function throttle(fn, wait) {
  let previous = 0;
  return function () {
    let now = Date.now();
    let _this = this;
    let args = arguments;
    if (now - previous > wait) {
      fn.apply(_this, arguments);
      previous = now;
    }
  };
}

应用场景

  • 防抖:适用于输入框的搜索、验证,窗口大小调整后的布局计算等。

  • 节流:适用于滚动加载、窗口大小调整时的动画效果、鼠标移动时的绘制等。

Released under the MIT License.