返回

阿里的 Lodash 是如何实现节流和防抖的?

前端

在前端开发中,我们经常需要处理事件处理函数,这些函数会在特定事件发生时触发。为了防止这些函数被频繁调用,从而导致性能问题,我们可以使用节流函数和防抖函数来优化代码的执行。

Lodash 是一个流行的 JavaScript 库,它提供了丰富的实用函数,其中就包括节流函数 throttle 和防抖函数 debounce。本文将深入剖析 Lodash 中防抖和节流函数的实现原理,并提供代码示例和应用场景,帮助您更好地理解和使用这些函数来优化前端代码的性能。

Lodash 中防抖和节流函数的实现原理

防抖函数 debounce

防抖函数 debounce 的作用是限制函数在指定的时间间隔内只执行一次。也就是说,当函数被多次连续调用时,它只会执行最后一次调用的结果。

Lodash 中的防抖函数 debounce 的实现原理如下:

  1. 使用闭包保存一个定时器变量 timer。
  2. 当函数被调用时,首先清除上一次的定时器,然后重新设置一个新的定时器。
  3. 当定时器触发时,执行函数并清除定时器。
const debounce = (func, wait, immediate) => {
  let timer;
  return function () {
    const context = this;
    const args = arguments;
    if (immediate && !timer) {
      func.apply(context, args);
    }
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(context, args);
      timer = null;
    }, wait);
  };
};

节流函数 throttle

节流函数 throttle 的作用是限制函数在指定的时间间隔内只执行一次。也就是说,当函数被多次连续调用时,它只会执行第一次调用的结果,而忽略其他调用的结果。

Lodash 中的节流函数 throttle 的实现原理如下:

  1. 使用闭包保存一个标志位 lastCalled,用于标记函数是否在指定的时间间隔内被调用过。
  2. 当函数被调用时,首先检查 lastCalled 的值。如果 lastCalled 为 false,则执行函数并设置 lastCalled 为 true。
  3. 当定时器触发时,将 lastCalled 重置为 false。
const throttle = (func, wait, options) => {
  const { leading = true, trailing = false } = options || {};
  let lastCalled = false;
  let timer;
  return function () {
    const context = this;
    const args = arguments;
    if (leading && !lastCalled) {
      func.apply(context, args);
      lastCalled = true;
    }
    if (trailing) {
      clearTimeout(timer);
      timer = setTimeout(() => {
        if (lastCalled) {
          func.apply(context, args);
          lastCalled = false;
        }
      }, wait);
    } else {
      clearTimeout(timer);
      timer = setTimeout(() => {
        lastCalled = false;
      }, wait);
    }
  };
};

Lodash 中防抖和节流函数的应用场景

防抖函数 debounce

防抖函数 debounce 可以用于以下场景:

  • 搜索框中的自动补全功能。当用户在搜索框中输入时,防抖函数可以防止自动补全功能被频繁触发,从而提高用户体验。
  • 表单验证。当用户在表单中输入时,防抖函数可以防止表单验证功能被频繁触发,从而提高表单的性能。
  • 窗口滚动事件处理。当用户滚动窗口时,防抖函数可以防止窗口滚动事件处理函数被频繁触发,从而提高页面的性能。

节流函数 throttle

节流函数 throttle 可以用于以下场景:

  • 窗口调整大小事件处理。当用户调整窗口大小时,节流函数可以防止窗口调整大小事件处理函数被频繁触发,从而提高页面的性能。
  • 鼠标移动事件处理。当用户移动鼠标时,节流函数可以防止鼠标移动事件处理函数被频繁触发,从而提高页面的性能。
  • 触摸事件处理。当用户触摸屏幕时,节流函数可以防止触摸事件处理函数被频繁触发,从而提高页面的性能。

总结

Lodash 中的防抖函数 debounce 和节流函数 throttle 是非常有用的函数,可以帮助我们优化前端代码的性能。通过理解这些函数的实现原理和应用场景,我们可以更好地使用这些函数来提高代码的执行效率。