防抖是“等停了再执行”,节流是“固定节奏执行”;防抖适用于只关心最终结果的场景(如搜索输入),节流适用于需持续反馈但限频的场景(如滚动监听)。
防抖和节流都是用来控制函数执行频率的技术,核心区别在于:防抖是“等停了再执行”,节流是“固定节奏执行”。选哪个,关键看用户操作的意图是否需要被完整响应。
防抖会让函数在最后一次触发后,等待指定时间无新触发才执行。中间所有调用都被忽略。
function debounce(fn, delay) {
let timer = null;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}
注意:每次新调用都会重置倒计时,且 this 和参数需正确传递(用 apply 或箭头函数绑定)。
节流保证函数在指定时间间隔内最多执行一次,即使触发多次,也按固定节奏执行(如每 100ms 最多跑一次)。
// 定时器版(更稳定,确保至少执行一次)
function throttle(fn, delay) {
let timer = null;
return function(...args) {
if (!timer) {
timer = setTimeout(() => {
fn.apply(this, args);
timer = null;
}, delay);
}
};
}
现代项目中,Lodash 的 debounce 和 throttle 已经处理好 this、参数、取消、立即执行等细节,建议直接用。自己实现主要用于理解原理或极简环境。另外,像 resize 或 scroll 这类高频事件,加上防抖/节流几乎是标配,不加很可能引发性能问题。