两者都是高频事件的性能优化手段。防抖(debounce):事件触发后延迟执行,若在等待期内再次触发则重新计时,只有「停下来」才真正执行——适合搜索输入联想、窗口 resize 后的重算。节流(throttle):固定时间间隔内只执行一次,保证均匀触发——适合滚动监听、按钮防连点(但防连点更常用防抖的立即执行版)。
function debounce(fn, wait) {
let timer = null;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), wait);
};
}
function throttle(fn, interval) {
let last = 0;
return function (...args) {
const now = Date.now();
if (now - last >= interval) {
last = now;
fn.apply(this, args);
}
};
}
易错点:实现时要保留 this 和参数(用 apply);防抖分「延迟执行」与「立即执行(leading)」两种变体;定时器版本节流与时间戳版本的行为差异(最后一次是否补执行)。追问:requestAnimationFrame 作为另一种节流思路。