防抖函数支持前置触发需配置 leading 选项,首次调用立即执行且重置计时,后续调用在延迟期内被忽略;其实现通过比较当前时间与 lastTime 的差值判断是否满足前置条件,满足则同步执行并更新时间戳,否则设定时器延后执行。

防抖函数支持前置触发(即立即执行第一次调用,后续在等待期内的调用被忽略,直到等待期结束才重新启用),关键是在配置项中增加一个 leading 选项,并在函数内部根据该选项决定是否在首次调用时立刻执行。
前置触发的核心逻辑
标准防抖是“等停”,而前置触发是“先干再等”。实现时需记录上一次执行时间,并结合 leading 配置判断:若为 true 且距离上次执行已超延迟时间,则立即执行;否则启动定时器延后执行。
- 用闭包保存上次执行时间(
lastTime)或定时器 ID(timer)和标记状态 - 每次触发先检查
leading和时间间隔条件,满足则同步执行并更新lastTime - 不满足前置条件时,仍按常规流程清除旧定时器、设置新定时器
带 leading 配置的防抖函数示例
以下是一个简洁可复用的实现:
function debounce(func, delay, options = {}) {
const { leading = false, trailing = true } = options;
let timer = null;
let lastTime = 0;
<p>return function(...args) {
const now = Date.now();</p><pre class="brush:php;toolbar:false;">if (leading && now - lastTime > delay) {
func.apply(this, args);
lastTime = now;
} else {
clearTimeout(timer);
timer = setTimeout(() => {
if (trailing) {
func.apply(this, args);
}
lastTime = Date.now();
}, delay);
}}; }
使用方式:const debounced = debounce(handler, 300, { leading: true, trailing: false });
这样会在第一次调用时立刻执行,后续 300ms 内的调用被忽略,直到超时后重置状态。
注意事项与常见误区
- leading 和 trailing 可同时为 true:首次立即执行,末次延迟执行(类似“首尾都响应”,但中间节流)
- leading 为 true 时,trailing 设为 false 更常见:避免重复触发,语义更清晰(“只抢第一下”)
- 时间判断建议用
Date.now()而非new Date().getTime(),性能略优 - 注意 this 指向和参数透传,示例中已用
func.apply(this, args)正确绑定
与节流的区别别混淆
前置防抖 ≠ 节流。节流是固定频率执行(如每 300ms 最多一次),而前置防抖仍是“事件停止后延迟执行”,只是加了“第一次破例”。它不会在连续触发中匀速执行,只保障首尾(或仅首)的响应时机。
立即学习“Java免费学习笔记(深入)”;


















