60 秒回答模板

防抖是连续触发时不断重置计时器,只有停止一段时间后执行最后一次,适合输入搜索、表单校验和 resize 结束后计算。节流是在固定时间窗口内最多执行一次,适合滚动监听、拖拽、曝光采样和进度同步。选择标准是业务要最终结果还是过程采样:如果用户还在输入时不希望发请求,用防抖;如果用户持续滚动时仍要按频率更新,用节流。实际实现还要考虑 leading、trailing、maxWait、取消定时器和组件卸载清理。

考点 核心机制与工程取舍
难度 中高频面试题
回答目标 按定义、机制、场景讲清楚

深入解析

01

先区分触发模型

防抖关注静默期:事件停止 delay 后执行。节流关注时间窗口:每隔 interval 最多执行一次。一个是等用户停下来,一个是控制执行频率。

02

再按业务意图选择

搜索联想、用户名校验和窗口调整后重排通常要最终输入结果,适合防抖。滚动位置同步、拖拽反馈、按钮防连点和曝光上报需要持续采样,适合节流。

03

解释为什么不用节流

如果输入搜索用了节流,用户还没输完就可能按窗口发出中间态请求,产生无效结果和接口压力。防抖能等最后一次输入稳定后再请求,更符合搜索框语义。

04

首尾触发会改变体验

leading 表示第一次立刻执行,trailing 表示结束后补一次。搜索通常要 trailing,按钮防重复可能要 leading,滚动统计常同时需要 leading 和 trailing。maxWait 能避免持续输入太久导致永远不执行。

05

实现要考虑生命周期

防抖和节流内部通常持有 timer、lastTime、lastArgs。组件卸载时要 cancel,避免异步回调 setState 到已卸载组件;需要 flush 时也要显式暴露能力。

易错点

  • 把防抖和节流都说成减少执行次数,却讲不出停止后执行和固定频率执行的本质差异。
  • 搜索输入使用节流还声称更省请求,忽略中间态请求和结果闪烁。
  • 不区分 leading 和 trailing,导致按钮点击延迟响应或滚动结束缺最后一次同步。
  • 封装函数只设置 timer 不暴露 cancel,组件卸载后仍执行回调。

面试官追问

输入搜索为什么通常用防抖?

因为业务关心用户最终输入,而不是每个中间字符。防抖能减少无效请求,并避免旧结果频繁覆盖新输入。

按钮防重复用防抖还是节流?

更常用 leading 型节流或显式 submitting 锁,第一次点击立即生效,窗口期内忽略重复点击。纯 trailing 防抖会让用户点击后没有即时反馈。

maxWait 有什么用?

它保证持续高频触发时最长等待一段时间也会执行一次,避免纯防抖在用户一直输入或拖动时永远不触发。

组件卸载时为什么要 cancel?

定时器回调可能在组件销毁后执行,导致状态更新警告、无意义请求或覆盖新页面状态,所以要在卸载阶段清理。