防抖函数支持立即执行指首次触发时立刻执行,后续触发按延迟执行;需用闭包变量区分首次/非首次及定时器状态,通过immediate参数控制,兼顾响应与节流。

防抖函数(Debounce)的核心是“延迟执行”,而“支持立即执行”指的是:在首次触发时**立刻执行一次**,之后的连续触发则仍按防抖逻辑延迟执行(即“首次立即,后续防抖”)。这常用于搜索框输入、按钮点击防重复等场景,兼顾响应速度与节流效果。
关键设计思路
要实现“立即执行 + 后续防抖”,不能只靠一个定时器,而需区分两种状态:
-
是否为首次触发:用闭包变量记录,首次设为
true,执行后置为false -
是否有待执行的延迟任务:用
timer记录当前定时器 ID,便于取消 - 首次触发时直接执行函数,并启动一个延迟定时器(用于清理“后续可能到来的触发”)
- 非首次触发时,先清除旧定时器,再重设新定时器(不执行函数)
基础实现(带 immediate 参数)
以下是一个简洁、可复用的防抖函数,支持通过 immediate 参数控制是否立即执行:
function debounce(func, wait, immediate = false) {
let timer = null;
return function executedFunction(...args) {
const later = () => {
timer = null;
if (!immediate) {
func(...args);
}
};
const shouldCallNow = immediate && !timer;
if (shouldCallNow) {
func(...args);
}
clearTimeout(timer);
timer = setTimeout(later, wait);
};
}
✅ 使用示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
立即执行模式:
const debounced = debounce(() => console.log('run'), 300, true);
第一次调用立刻打印,之后 300ms 内重复调用不会再次执行,300ms 后首次调用又会立即执行 -
常规防抖模式(
immediate = false):行为与传统防抖一致,即“最后一次触发后等待 wait 毫秒再执行”
注意事项与常见坑
使用时注意几个细节,避免意外行为:
-
闭包变量隔离:每个
debounce(...)调用返回独立的函数,timer和状态互不干扰 -
this 指向:上述实现中,
func(...args)会丢失原始调用的this。如需保留,可用func.apply(this, args)替代 -
参数透传:使用剩余参数
...args确保所有参数正确传递,兼容箭头函数和普通函数 -
立即执行 ≠ 总是执行:即使
immediate=true,也仅在“无活跃定时器时的首次触发”才立即执行;连续高频触发下,只有第一个会立即执行,其余被抑制
增强版(支持取消 & 立即执行后重置)
如果需要手动取消防抖,或希望在取消后下一次触发仍能立即执行(即重置状态),可扩展如下:
function debounce(func, wait, immediate = false) {
let timer = null;
let isPending = false;
const debounced = function (...args) {
if (immediate && !isPending) {
func(...args);
isPending = true;
}
clearTimeout(timer);
timer = setTimeout(() => {
if (immediate) {
isPending = false;
} else {
func(...args);
}
}, wait);
};
debounced.cancel = () => {
clearTimeout(timer);
timer = null;
isPending = false;
};
return debounced;
}
这样调用 debounced.cancel() 后,下次触发又能恢复“立即执行”能力,适合更复杂的交互控制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










