节流函数的核心是在指定时间窗口内最多执行一次,通过闭包保存lasttime或timer实现时间判断与状态隔离;支持leading立即执行和trailing延迟补执行,确保多实例独立且状态私有。

节流函数的核心是:在指定时间窗口内,只让函数最多执行一次。闭包用来保存上一次执行的时间戳(或定时器状态),从而判断是否该放行本次调用。
用闭包保存上次执行时间
最常用的方式是记录上一次成功执行的时间点,每次调用时比较当前时间与上次执行时间的差值,大于等于设定间隔才执行,并更新时间戳。
- 闭包变量 lastTime 存储上一次执行的真实时间(
Date.now()) - 调用时计算
now - lastTime >= delay,满足则执行并更新lastTime - 不满足就直接返回,不执行也不重置,保持“锁定”状态
用闭包保存定时器实现“尾部节流”
另一种常见策略是:首次触发立即执行,之后在 delay 时间内忽略新调用;但最后一次调用会在 delay 结束后补执行(即“延迟执行最后一次”)。这需要闭包保存定时器 ID 和参数。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 闭包变量 timer 记录当前 pending 的定时器
- 每次调用先清除旧定时器,再设置新的
setTimeout - 定时器回调中执行函数,并将 timer 置为
null
结合两者:带立即执行选项的通用节流
实际项目中常需支持“首次立即执行”或“等待首次 delay 后再执行”。这时闭包需同时维护 lastTime、timer 和配置项 leading/trailing。
- 若
leading === true,首次调用立刻执行并记录lastTime - 若
trailing === true,且上次没执行过,则在 delay 后补一次 - 所有状态(
lastTime、timer、pendingArgs、pendingThis)都靠闭包私有化,不暴露给外部
注意锁定逻辑的关键细节
所谓“锁定执行状态”,本质是拒绝不符合时间条件的调用。闭包确保这个判断逻辑和状态不被外部干扰。
- 不能把
lastTime或timer放到全局或对象属性上,否则易被误改 - 多个节流函数实例之间必须隔离 —— 每次调用
throttle(fn, delay)都应生成独立闭包 - 如果函数可能被频繁取消(如页面卸载),记得在必要时清理定时器(
clearTimeout(timer))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










