防抖是“等用户停止触发后执行一次”,节流是“固定时间间隔内最多执行一次”;二者均用于优化resize、scroll、input等高频事件的性能损耗,防抖适用于搜索输入、窗口调整等需等待完成的场景,节流适用于滚动加载、鼠标移动等需持续反馈的场景。

防抖(Debounce)和节流(Throttle)是 JavaScript 中用来控制函数执行频率的两种常见策略,核心区别在于:防抖是“等你停了再执行”,节流是“固定节奏执行”。它们不是为了优化代码本身,而是为了解决高频事件(比如 resize、scroll、input、mousemove)导致函数被过度调用的问题,避免性能损耗或逻辑异常。
防抖:最后一次触发后延迟执行
防抖的逻辑是:只要事件持续触发,就不断重置定时器;只有当事件停止触发一段时间(比如 300ms)后,才真正执行一次函数。
- 适用于用户“意图明确”之后才需要响应的场景
- 搜索框输入联想:用户还在打字时,不发请求;等他停顿片刻,再发起搜索
- 窗口大小调整(resize)后的布局重排:等用户彻底拖完窗口再重新计算尺寸,避免反复渲染
- 表单校验(如邮箱格式):等用户输完再提示,而不是每敲一个字符都校验
节流:固定时间间隔内最多执行一次
节流的逻辑是:无论事件触发多频繁,函数只按设定的时间间隔(比如每 100ms)执行一次。常用实现方式有定时器法或时间戳法。
- 适用于需要“持续反馈”但又不能太密的场景
- 滚动监听(scroll):实现滚动到底部加载更多、滚动中更新吸顶导航状态
- 鼠标移动(mousemove):画布绘图、拖拽位置更新,不需要每一帧都处理
- 游戏或动画中的输入采样:保证操作响应及时,又不至于压垮主线程
简单对比:什么时候选哪个?
看用户行为是否需要“等待完成”——如果希望等用户停下来再动作,选防抖;如果希望过程中也保持一定响应节奏,选节流。
标签: javascript java 联想 ai 邮箱 区别 canva
还木有评论哦,快来抢沙发吧~