时间戳闭包实现的节流函数通过保存并比对上次执行时间来控制调用频率:外层函数定义previous=0,内层函数每次获取当前时间,若与previous差值≥wait则执行并更新previous,否则跳过,首次必执行且无需清理定时器。

节流函数中用时间戳比对的闭包实现,核心在于保存上一次执行的时间,每次触发时拿当前时间减去上次时间,大于等于设定间隔才执行,并更新时间戳。
时间戳比对的基本逻辑
节流不是“固定周期执行”,而是“至少间隔多久才执行一次”。时间戳方案不依赖定时器,靠记录 上次执行的真实时间点 来判断是否满足间隔条件。闭包用来持久化这个时间戳变量,避免每次调用都重置。
闭包封装时间戳变量
把 previous(上一次执行时间)放在外层函数作用域里,内层返回的函数通过闭包持续访问并更新它:
- 首次调用时,
previous初始为 0,当前时间减 0 肯定 ≥ wait,立即执行并更新previous = Date.now() - 后续调用时,只在
Date.now() - previous >= wait成立时执行,否则跳过 - 一旦执行,就刷新
previous,为下一次比对做准备
典型实现代码
一个简洁可靠的时间戳节流函数:
立即学习“Java免费学习笔记(深入)”;
function throttle(func, wait) {
let previous = 0;
return function(...args) {
const now = Date.now();
if (now - previous >= wait) {
func.apply(this, args);
previous = now;
}
};
}注意:这里用 Date.now() 而非 new Date().getTime(),更轻量;apply 保证 this 和参数正确传递;previous 初始值设为 0,确保首次必执行。
和定时器节流的区别
时间戳方案是“被动等待满足条件”,执行时机由用户触发节奏决定,可能连续触发但只在满足间隔时响应;而定时器方案(如使用 setTimeout)是“主动抢占执行权”,更容易控制最大频率,但需清理定时器、处理边缘情况。时间戳闭包实现更轻量、无副作用、无需清理。


















