防抖的核心是只执行最后一次回调,通过 cleartimeout清除前次定时器并重设新定时器;支持延迟执行(默认)和立即执行(immediate=true)两种模式,需正确绑定this与args,且应提供cancel方法防止内存泄漏。

防抖(Debounce)的核心是:在事件频繁触发时,只执行最后一次的回调,中间的都忽略。关键在于每次触发时清除之前的定时器,再重新设置一个新的。
基础实现(带立即执行选项)
一个实用的防抖函数通常支持两种模式:延迟执行(默认)和立即执行(首次触发立刻运行,后续连续触发不执行,直到停止触发后再次等待间隔才可重新触发)。
- 用 setTimeout 控制延迟执行
- 用 clearTimeout 清除上一次未执行的定时器
- 通过 immediate 参数控制是否立即执行
- 注意保存 this 和 arguments,确保回调能正确接收上下文和参数
代码示例:
let timeout;
return function(...args) {
const later = () => {
timeout = null;
if (!immediate) func.apply(this, args);
};
const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(this, args);
};
}
使用场景举例
比如搜索框输入防抖:
- 用户每打一个字就触发 input 事件,但你不想每次按键都发请求
- 设 wait = 300ms,用户连续输入 5 个字符,只在最后停顿 300ms 后执行一次搜索
- 若加 immediate: true,则第一次输入立刻查,之后连续输入不查,等停顿后再恢复可查
注意事项
- 记得在组件卸载或不再需要时手动清除定时器(如 React 中 useEffect 的 cleanup),避免内存泄漏
- 不要在防抖函数内部直接用箭头函数定义定时器回调,否则无法 clearTimeout —— 必须把 timer ID 存在闭包变量里
- 如果需要取消正在等待的防抖(比如主动中止),可以给返回的函数添加 cancel 方法
增强版:支持 cancel 方法
在返回的防抖函数上挂一个 cancel 方法,方便外部主动清理:
const debounced = debounce(myFunc, 200);debounced.cancel = () => clearTimeout(timeout);
实际中更推荐封装进函数体内部,让调用方直接使用 debounced.cancel()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











