选防抖还是节流,关键看响应“最终结果”还是“过程节奏”:需等用户停手再执行(如搜索、resize、表单校验)用防抖;需持续、定期反馈(如滚动加载、拖拽、mousemove)用节流。

选防抖还是节流,关键看你要响应“最终结果”还是“过程节奏”。不是凭感觉,而是由用户行为意图和业务逻辑决定的。
需要等用户彻底停手再响应?用防抖
这类场景的特点是:中间过程不重要,只关心最后一次输入或操作后的稳定状态。
- 搜索框联想:用户快速输入“前端面试题”,你不需要在敲“前”“前端”“前端面”时都发请求,只需等他打完、停顿 300ms 后,拿完整关键词去查
- 窗口 resize 后重排布局:浏览器在拖拽调整窗口大小时会高频触发 resize,但你真正要做的,是等用户松手、尺寸稳定后再计算新宽高、更新组件,避免反复回流
- 表单输入校验(非实时):比如邮箱格式校验,不必每输一个字符就标红,等用户离开输入框或停顿后再验证更合理
必须定期反馈、不能丢掉过程?用节流
这类场景的特点是:事件本身代表连续动作,你需要以可控频率捕获关键帧,否则交互会断连或失真。
- 滚动加载更多:用户快速下滑,你得在滚动过程中及时判断是否接近底部。如果用防抖,可能一直没触发——因为他始终在动;节流能保证每 200ms 检查一次 scrollTop,及时发起下一页请求
- 鼠标拖拽/画布绘制:拖动元素时,坐标需持续更新。若用防抖,松手前位置不会变化;节流则能按固定间隔取点,保证移动平滑(配合 requestAnimationFrame 更佳)
- mousemove 实时显示坐标或热区:用户滑动鼠标,界面要同步反馈。等他停下才显示?那就失去意义了
容易踩坑的边界情况
有些场景看似模糊,其实有明确倾向:
- 按钮防重复点击:表面像节流(限制频率),实则是防抖逻辑——你只希望“点击动作完成一次”,而不是“每 500ms 允许点一次”。更适合用防抖 + immediate = true,即点下立刻禁用按钮,防止连点
- resize 中做 canvas 重绘:若 canvas 内容简单,可用防抖;若含动画或实时渲染,建议节流 + requestAnimationFrame 组合,兼顾性能与流畅性
- 移动端 touchmove 手势识别:优先节流,因为手指滑动是连续轨迹,防抖会丢失中间位移,导致手势识别失败
一句话决策树
问自己三个问题:
- 用户操作后,是否需要立刻看到反馈?→ 是 → 节流
- 用户操作中,中间状态有没有业务价值?→ 否 → 防抖
- 如果事件一直不停(比如持续滚动),函数是否必须执行至少一次?→ 是 → 节流


















