debounce 和 throttle 到底差在哪?200 次连续输入实测触发次数 一次输入 200 个事件同一份数据同时喂给 debounce 和 throttle谁触发几次、差在哪页面当场报数。先把结论摆出来。同一段 200 事件的输入流debounce 只触发 6 次throttle 触发 22 次差了 16 次。源码在本案例目录可直接下载https://atomgit.com/deli007/demo_park/tree/main/codearts-debounce-throttle-lab生成物只有一个index.html纯前端、零依赖、不联网全部计算都在浏览器里完成。它不是严谨的框架基准测试只是一台看得见的演示台。为什么值得看一个等「停」一个按「表」这两个词几乎总是成对出现含义却相反。debounce 盯的是停顿事件一直来它就一直等等安静下来才动手。throttle 盯的是节拍不管事件多密它按固定间隔动手到点就触发。搜索框联想怕请求过多该用 debounce。滚动加载怕漏掉中间状态该用 throttle。选反了要么每敲一个字母就发一次请求要么滚动时半天不动。所以我没打算复述书上的定义而是写了一段固定的输入流让两个函数真跑一遍用数字说话。进入 AI 开发者空间码道 Web打开 https://devcloud.cn-north-4.huaweicloud.com/chat/home 用自然语言描述你要做的应用就能开始。页面不用安装浏览器里打开就能对话。这份输入流是怎么造的页面用固定种子生成 200 个事件中间夹着 6 段密集连打和 6 段停顿。首末事件跨度 5773ms差不多 5.8 秒。种子写死在代码里所以每次打开都是同一条输入流数字可复现。真正难的从来不是画图是让「实测」两个字经得起核对。这条输入流是造出来的不是真实用户流量。所以它说明的是两种实现的差异不是线上压测的吞吐结论。自检里那句「密集连打 13 段」是按 300ms 滑窗数出来的比肉眼分的 6 段更细。怎么做与踩坑第一版里throttle 的理论值是用估算公式算的和实测差了 41%对不上。我没有凑数改成让主实现真跑再拿一个独立写法重算一遍做对照。throttle 的参考实现走窗口扫描写法维护 lastRun 和计时器逐段推演。页面主实现走定时器队列写法两套算法思路完全不同。同一条输入流下两套实现都给出 22 次差 0。踩得最深的一个坑是 throttle 的 trailing 开关。关掉 trailing 之后最后一段连打的收尾事件没人接直接被丢掉。页面会弹一条红色错误提示写明尾段丢了 24 个事件整条流一共丢弃 185 个。实测触发次数也从 22 掉到 15。这条提示不是装饰它是「配置写错时会发生什么」的现场演示。本地复现生成物只有一个index.html纯前端、零依赖、不联网。把文件存到本地双击就能打开。想用静态服务也行python -m http.server 8000然后访问 http://localhost:8000 。页面上点「内置自检」应该看到 14/14 通过。自己拖一遍参数更直观debounce 延迟调到 50ms 是 6 次调到 1000ms 只剩 1 次。再把 throttle 的 trailing 关掉触发次数从 22 变成 15红色提示同时出现。使用码道体会这轮下来最省事的一条是把验收方式写进需求。我在需求里直接写「完成后打开预览」模型就自己跑了一遍省掉一轮来回确认。第二条是断言要给出参考值。我要求自检覆盖「跨度落区间、debounce 次数不超过 throttle、immediate 首触发接近 0」它就把 14 条真的做进了页面。只写「加个自检」多半只能换来一句打印。第三条是把模糊描述翻成可执行的判据。「平滑」翻成具体缓动「丢事件」翻成 trailing 关闭后统计到的丢弃数页面数字才对得上。直接下载试玩仓库地址https://atomgit.com/deli007/demo_park本案例目录https://atomgit.com/deli007/demo_park/tree/main/codearts-debounce-throttle-lab总结回到最开始那个问题debounce 和 throttle 差的不是实现是「等谁」。debounce 等事件停下来所以触发次数由停顿决定。throttle 等时间到点所以触发次数由跨度决定。想接着玩可以把延迟滑到两端看次数怎么变也可以给输入流加一段超长停顿看 debounce 的组数怎么动。