时间戳版首次立即执行,适合需即时反馈的场景;定时器版首次延迟执行、末次滞后,适合节奏稳定的控制;合成版兼顾两者。

JavaScript 简易节流函数用定时器和时间戳两种方式都能实现,但行为逻辑、首次执行时机、适用场景有明显差异。选哪种,关键看你要“立刻响应”还是“稳定节奏”。
时间戳版:首次触发就执行,适合需要即时反馈的场景
它靠记录上一次执行的时间戳,每次触发时对比当前时间,差值够大才执行并更新时间戳。
- 第一次调用立即执行,无延迟
- 后续执行严格按“间隔阈值”控制,比如设 200ms,那最多每 200ms 执行一次
- 滚动监听、鼠标移动等需要快速响应又不想太密的场景很合适
- 缺点是:如果用户持续高频触发(如猛滚轮),函数仍会尽可能贴近间隔上限执行,无法完全“削峰”
定时器版:延迟执行,保证最小间隔,适合节奏感强的控制
它用一个 timer 标识位 + setTimeout,触发时若 timer 为空才设新定时器,定时器到点才执行并清空 timer。
- 首次触发不会马上执行,要等 delay 时间后才执行第一次
- 在 delay 期间内多次触发,只保留最后一次“排队”,确保两次执行之间至少隔 delay
- 适合 resize、拖拽位置上报等对执行时机不敏感、但要求节奏稳定的场景
- 缺点是:用户停止操作后,还要等一次 delay 才执行末次,体验略滞后
简单对比表(delay = 300ms)
假设连续触发 5 次,时间点为 0ms、100ms、200ms、350ms、400ms:
- 时间戳版:在 0ms(立即)、350ms(≥300ms 后)各执行一次 → 共 2 次
- 定时器版:0ms 触发设 timer,300ms 执行;350ms 再触发又设 timer,650ms 执行 → 共 2 次,但第二次在 650ms
怎么选?看需求侧重点
- 要“用户一动就反馈”,比如滚动时实时计算可视区域 → 选时间戳版
- 要“稳住节奏不抢频”,比如缩放画布后统一重绘 → 选定时器版
- 想兼顾两者?可用“时间戳 + 定时器”合成版:首次立即执行,后续用定时器兜底,避免漏掉末次
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











