返回
剖析 throttle 与 debounce 源码,理解节流与防抖背后的原理与应用场景
前端
2024-02-12 19:56:32
前言
在前端开发中,我们经常会遇到需要对函数执行频率进行控制的情况,比如当用户在输入框中输入内容时,我们可能希望在用户停止输入一段时间后才触发搜索请求。此时,我们就可以使用节流或防抖来控制函数的执行频率。throttle(节流)和debounce(防抖)都是用来控制函数执行频率的,但它们的工作原理却有所不同。
throttle(节流)
节流函数会在一定时间内只执行一次,即使在这个时间内函数被调用多次。节流函数通常用于控制那些不需要频繁执行的函数,比如滚动事件、调整窗口大小事件等。
// 节流函数
const throttle = (fn, delay) => {
let timer = null;
return (...args) => {
if (timer) {
return;
}
timer = setTimeout(() => {
fn.apply(this, args);
timer = null;
}, delay);
};
};
debounce(防抖)
防抖函数会在触发事件后,在 n 秒后才能执行一次。如果在 n 秒内又触发了事件,则会重新计算函数的执行时间。防抖函数通常用于控制那些需要在用户停止操作后才执行的函数,比如搜索请求、提交表单等。
// 防抖函数
const debounce = (fn, delay) => {
let timer = null;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
};
应用场景
节流和防抖在前端开发中都有广泛的应用场景,以下是一些具体的例子:
-
节流:
- 滚动事件:在滚动事件中,我们可以使用节流函数来控制滚动条的滚动频率,避免滚动条过于频繁地触发滚动事件。
- 调整窗口大小事件:在调整窗口大小事件中,我们可以使用节流函数来控制窗口大小调整的频率,避免窗口大小过于频繁地触发调整窗口大小事件。
-
防抖:
- 搜索请求:在搜索框中输入内容时,我们可以使用防抖函数来控制搜索请求的触发频率,避免在用户输入内容的过程中频繁地触发搜索请求。
- 提交表单:在提交表单时,我们可以使用防抖函数来控制表单提交的频率,避免用户在短时间内重复提交表单。
总结
节流和防抖都是用来控制函数执行频率的,但它们的工作原理却有所不同。节流函数会在一定时间内只执行一次,即使在这个时间内函数被调用多次。防抖函数会在触发事件后,在 n 秒后才能执行一次。如果在 n 秒内又触发了事件,则会重新计算函数的执行时间。在前端开发中,节流和防抖都有广泛的应用场景,我们根据具体的业务需求来选择使用节流或防抖。