支持取消的防抖控制器通过闭包保存timer引用,返回含fn(重置定时器)和cancel(清除定时器)的对象;每次调用fn先cleartimeout再设新定时器,cancel置timer为null确保后续正常工作。

实现一个支持取消功能的防抖控制器,核心是保存当前定时器的引用,并提供一个 cancel 方法来清除它。这样在新任务触发前,能主动中断上一次未执行的延迟调用。
基础结构:返回含 fn 和 cancel 的对象
防抖函数本身不直接执行逻辑,而是返回一个控制器对象,包含:
- fn:被防抖包装后的函数,每次调用会重置定时器
- cancel:立即清除待执行的定时器,防止回调被调用
关键细节:闭包保存 timer 引用,避免污染外部作用域
timer 必须在闭包内维护,确保每次调用 fn 时都能访问并清除上一个定时器。注意:
- 使用
let timer = null初始化,方便后续判断和清除 - 每次进入防抖函数体,先
clearTimeout(timer),再设置新的setTimeout -
cancel方法只需执行一次clearTimeout(timer)并将 timer 置为null(可选,便于调试)
完整可运行代码示例
下面是一个简洁、健壮、支持立即执行选项(leading)和取消能力的实现:
function createDebounce(func, delay, options = {}) {
let timer = null;
const { leading = false } = options;
const debounced = function (...args) {
clearTimeout(timer);
if (leading && !timer) {
func.apply(this, args);
}
timer = setTimeout(() => {
func.apply(this, args);
timer = null;
}, delay);
};
const cancel = () => {
clearTimeout(timer);
timer = null;
};
return {
fn: debounced,
cancel
};
}
// 使用示例:
const controller = createDebounce(() => console.log('执行了'), 300);
controller.fn(); // 启动计时
controller.fn(); // 重置计时
controller.cancel(); // 立即取消,后续不会执行
进阶提示:cancel 后的状态与边界处理
调用 cancel 后,即使再次调用 fn,也能正常工作——因为 timer 已被清空,不影响下一轮防抖逻辑。无需额外重置状态。若需支持「立即执行且不可取消」的首次调用,leading 逻辑中判断 !timer 是关键,避免重复触发。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











