防抖和节流有什么区别搜索框和滚动事件分别怎么选防抖会把一段连续触发合并处理。常见的尾部防抖是每次触发重新计时等一段时间没有新触发再执行最后一次。因此搜索建议、输入校验这类关心最终输入的功能通常适合防抖。节流则控制执行频率。即使事件一直发生也会按约定的时间间隔提供执行机会适合滚动位置统计、拖动过程更新等持续反馈的场景。两者都需要明确是否立即执行、结束时是否补一次以及要不要支持取消。一直输入时也需要定期反馈可以考虑带最长等待时间的防抖。另外它们只限制触发并不自动解决请求乱序。搜索接口还需要取消旧请求或者在响应回来时检查它对应的输入版本避免旧结果盖住新结果。图中上轨为 200ms 尾部防抖下轨按 300ms 首部节流示意两条轨道使用同一串触发事件但时间窗口不同。沿着一串输入事件看看函数在哪个时刻运行为什么每次按键都搜索会有问题假设咱们在搜索框里输入 agent。每次按键都请求后端可能依次收到 a、ag、age、agen、agent。用户主要关心最后的完整输入中间几个请求却占用了网络和服务端资源。尾部防抖会保留最新输入每次按键把等待时间往后推。例如约定等待 300 毫秒只要还在连续输入就继续等待。最后一次输入以后安静了 300 毫秒才执行搜索。这是演示参数不是所有搜索框都应使用的标准值。防抖不能直接代替持续反馈如果页面滚动时需要更新当前位置只有尾部防抖可能让位置提示一直不变直到用户停止。节流会给持续事件留出规律的执行机会。不过“每 300 毫秒最多一次”还不够完整第一次是否立即执行最后一次事件是否补执行也会影响用户看到的结果。因此在选择工具以前先问当前功能是关心最终状态还是需要看到过程。防抖和节流的各种 leading/trailing 选项是在细化这个约定。先实现一个范围明确的尾部防抖下面两个版本都使用各自的事件循环定时器只演示“最后一次输入后再执行”。不包含立即触发、最长等待时间或生产组件的完整清理封装。TypeScriptfunctiondebounceTextendsunknown[](fn:(...args:T)void,delay:number){lettimer:ReturnTypetypeofsetTimeout|undefined;return(...args:T){if(timer!undefined)clearTimeout(timer);timersetTimeout(()fn(...args),delay);};}constsearchdebounce((text:string)console.log(text),300);search(ag);search(agent);// 安静 300 ms 后只输出 agentPythonimportasynciodefdebounce(fn,delay):handleNonedefwrapped(*args):nonlocalhandleifhandleisnotNone:handle.cancel()loopasyncio.get_running_loop()handleloop.call_later(delay,fn,*args)returnwrappedasyncdefmain():searchdebounce(print,0.3)# 秒search(ag)search(agent)awaitasyncio.sleep(0.35)asyncio.run(main())这两个示例限定同步回调。实际搜索通常会发起异步请求还要补取消、异常处理和组件卸载清理。为什么少发请求以后结果仍可能不对假设搜索 A 已经发出。用户停一下继续输入 B又发出了搜索 B。B 先返回页面显示 B随后 A 返回如果直接覆盖页面用户又看到了旧结果。防抖并不能撤回已经执行的请求。可以在发请求时保存递增的 requestVersion响应回来以后与当前版本比较。只有当前版本才能更新界面。支持取消时也可以终止旧请求。但取消和完成可能竞争版本检查仍然有价值。检查这套逻辑时要分别测试持续输入、短暂停顿、长时间不停输入、组件卸载以及响应倒序返回。只检查请求次数很容易漏掉最后这一种问题。本题机制参考MDN 防抖、MDN 节流、Python asyncio 定时调用。面试官继续追问防抖能防止重复付款吗不能。它最多合并一部分前端触发。网络重试、多设备提交和页面刷新仍可能造成重复请求可靠防重需要服务端业务幂等。拖动动画一定要用固定时间节流吗与绘制相关的更新也可以通过 requestAnimationFrame 合并到渲染节奏。先看更新的目的再决定用时间窗口还是绘制机会。用户持续输入也想定期搜索怎么办可以约定最长等待时间或者采用适合的节流策略。要说明是最新输入、当前过程还是最后状态需要反馈不仅是给函数加一个参数。面试速记卡尾部防抖连续触发后安静一段时间再执行。节流持续触发期间按约定频率执行。行为契约说明 leading、trailing、取消与最长等待。异步结果减少触发不等于解决响应乱序。测试同时检查次数、时刻和最终显示内容。我是程序员Sunday。本文收录于 sunday面试指南原文与配图可继续阅读。