返回
阿里的 Lodash 是如何实现节流和防抖的?
前端
2023-12-04 19:57:07
在前端开发中,我们经常需要处理事件处理函数,这些函数会在特定事件发生时触发。为了防止这些函数被频繁调用,从而导致性能问题,我们可以使用节流函数和防抖函数来优化代码的执行。
Lodash 是一个流行的 JavaScript 库,它提供了丰富的实用函数,其中就包括节流函数 throttle 和防抖函数 debounce。本文将深入剖析 Lodash 中防抖和节流函数的实现原理,并提供代码示例和应用场景,帮助您更好地理解和使用这些函数来优化前端代码的性能。
Lodash 中防抖和节流函数的实现原理
防抖函数 debounce
防抖函数 debounce 的作用是限制函数在指定的时间间隔内只执行一次。也就是说,当函数被多次连续调用时,它只会执行最后一次调用的结果。
Lodash 中的防抖函数 debounce 的实现原理如下:
- 使用闭包保存一个定时器变量 timer。
- 当函数被调用时,首先清除上一次的定时器,然后重新设置一个新的定时器。
- 当定时器触发时,执行函数并清除定时器。
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 的实现原理如下:
- 使用闭包保存一个标志位 lastCalled,用于标记函数是否在指定的时间间隔内被调用过。
- 当函数被调用时,首先检查 lastCalled 的值。如果 lastCalled 为 false,则执行函数并设置 lastCalled 为 true。
- 当定时器触发时,将 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 是非常有用的函数,可以帮助我们优化前端代码的性能。通过理解这些函数的实现原理和应用场景,我们可以更好地使用这些函数来提高代码的执行效率。