真实面经题目 · 原创解析
为什么不用节流,说说防抖和节流的区别
这题考察防抖和节流的触发模型、场景选择和首尾触发配置,重点不是背定义,而是能解释为什么某个业务不用节流。
真实面经题目 · 原创解析
这题考察防抖和节流的触发模型、场景选择和首尾触发配置,重点不是背定义,而是能解释为什么某个业务不用节流。
防抖是连续触发时不断重置计时器,只有停止一段时间后执行最后一次,适合输入搜索、表单校验和 resize 结束后计算。节流是在固定时间窗口内最多执行一次,适合滚动监听、拖拽、曝光采样和进度同步。选择标准是业务要最终结果还是过程采样:如果用户还在输入时不希望发请求,用防抖;如果用户持续滚动时仍要按频率更新,用节流。实际实现还要考虑 leading、trailing、maxWait、取消定时器和组件卸载清理。
防抖关注静默期:事件停止 delay 后执行。节流关注时间窗口:每隔 interval 最多执行一次。一个是等用户停下来,一个是控制执行频率。
搜索联想、用户名校验和窗口调整后重排通常要最终输入结果,适合防抖。滚动位置同步、拖拽反馈、按钮防连点和曝光上报需要持续采样,适合节流。
如果输入搜索用了节流,用户还没输完就可能按窗口发出中间态请求,产生无效结果和接口压力。防抖能等最后一次输入稳定后再请求,更符合搜索框语义。
leading 表示第一次立刻执行,trailing 表示结束后补一次。搜索通常要 trailing,按钮防重复可能要 leading,滚动统计常同时需要 leading 和 trailing。maxWait 能避免持续输入太久导致永远不执行。
防抖和节流内部通常持有 timer、lastTime、lastArgs。组件卸载时要 cancel,避免异步回调 setState 到已卸载组件;需要 flush 时也要显式暴露能力。
因为业务关心用户最终输入,而不是每个中间字符。防抖能减少无效请求,并避免旧结果频繁覆盖新输入。
更常用 leading 型节流或显式 submitting 锁,第一次点击立即生效,窗口期内忽略重复点击。纯 trailing 防抖会让用户点击后没有即时反馈。
它保证持续高频触发时最长等待一段时间也会执行一次,避免纯防抖在用户一直输入或拖动时永远不触发。
定时器回调可能在组件销毁后执行,导致状态更新警告、无意义请求或覆盖新页面状态,所以要在卸载阶段清理。