节流函数本质是让高频回调按固定节奏执行,依赖闭包维持私有状态;时间戳法“回头看”时间差,首次必执行、响应快;定时器法“向前设约定”,以最后一次触发为准、需停歇后执行。

节流函数的本质,是让高频触发的回调按固定节奏“发车”,而不是随事件涌来就立刻响应。它不靠阻断,而靠状态判断——而这个状态,必须私有、持久、可复用,所以闭包是必然选择。时间戳法和定时器法看似都是“限频”,但底层逻辑完全不同:一个靠“回头看时间差”,一个靠“向前设约定”。选错方法,行为就会偏离预期。
时间戳法:基于历史时间差做即时决策
每次触发时,直接拿当前时间减去上一次执行的时间(lastTime),差值 ≥ 间隔才执行,并立即更新 lastTime。整个过程同步完成,无异步延迟。
- 首次触发必执行(因为初始 lastTime 通常设为 0 或负值)
- 执行时机由“是否已过期”决定,响应快、节奏稳
- 适合 scroll、resize、mousemove 等需要持续采样位置/尺寸的场景
- 无法保证最后一次触发一定被执行(中间密集触发可能全被跳过)
定时器法:依赖异步任务调度做兜底执行
每次触发时,先清除已有定时器(clearTimeout(timer)),再新建一个延时任务。只有当触发停歇、定时器自然到期,回调才会执行。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 首次触发不会立即执行,而是等 delay 后才运行(除非额外加 leading 支持)
- 真正执行的是“最后一次有效触发”对应的回调,中间调用全被覆盖
- 适合输入搜索、按钮防连点等“以末次为准”的操作
- 若用户持续触发,函数永远不执行,直到停止后 delay 才触发一次
关键区别不在写法,而在执行语义
时间戳法回答的是:“现在能不能跑?”——它强调周期性稳定输出;定时器法回答的是:“等会儿谁来收尾?”——它强调对最终意图的捕捉。两者混用容易出错:比如在时间戳逻辑里加 clearTimeout,或在定时器逻辑里比对 lastTime,都会破坏各自的行为契约。
闭包在这两类实现中都承担同一角色:把 lastTime 或 timer 封装成私有状态,避免多个节流实例互相干扰。没有闭包,就无法安全复用 throttle(fn, delay) 多次。










