时间戳节流函数首次立即执行:初始化previous=0,每次调用比较now-previous≥delay,满足则执行并更新previous;无定时器、无内存泄漏,适用于scroll/resize等高频事件。

节流函数使用时间戳实现首次触发,核心思路是:记录上一次执行的时间,每次调用时比较当前时间与上次执行时间的差值,大于等于设定间隔才执行,并更新时间戳。首次调用时因无“上次时间”,可直接执行。
时间戳节流的关键逻辑
时间戳方式依赖 Date.now() 或 performance.now() 获取高精度时间。它天然支持首次立即执行——因为初始 previous = 0(或 null),第一次进入就满足 current - previous >= delay,从而触发函数。
- 初始化一个
previous = 0(表示尚未执行过) - 每次调用时取当前时间
current = Date.now() - 若
current - previous >= delay,则执行函数并更新previous = current - 否则不执行,直接返回
基础实现(支持首次立即执行)
以下是一个简洁可靠的时间戳节流函数:
function throttle(func, delay) {
let previous = 0;
return function(...args) {
const now = Date.now();
if (now - previous >= delay) {
func.apply(this, args);
previous = now;
}
};
}
✅ 特点:首次调用立刻执行;后续调用按固定间隔执行;无定时器、无内存泄漏风险;适合 scroll、resize 等高频事件。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
注意边界情况
实际使用中需留意几个细节:
-
闭包中的
previous是独立状态:每个节流函数实例维护自己的时间戳,互不影响 -
延迟参数单位为毫秒:例如
throttle(handler, 100)表示至少间隔 100ms 执行一次 - 无法保证最后一次触发:纯时间戳方案不缓存末次调用,如需“尾部触发”,需结合定时器(即“时间戳 + 定时器”混合方案)
-
this 和参数传递要正确:使用
func.apply(this, args)保证原上下文和参数透传
简单使用示例
绑定到滚动事件,控制日志输出频率:
const handleScroll = throttle(() => {
console.log('scrolling...', Date.now());
}, 200);
<p>window.addEventListener('scroll', handleScroll);</p>
滚动开始瞬间就会打印一次,之后至少每 200ms 打印一次,不会更频繁。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










