已合作成功的客户

遍及全国及海外

中国

杭州,绍兴,宁波,湖州,嘉兴,温州,台州,上海,北京,南京,苏州,常州,无锡,长沙,青岛,江西,台湾,南宁,海南,成都,哈尔滨,深圳,香港,沈阳 ...

海外

美国,加拿大,丹麦,澳大利亚,新加坡,法国,智利,日本,英国 ...

合作咨询

4001-355-360

洞见

news

洞察行业新闻,实时了解最新动态

前端防抖(Debounce)和节流(Throttle)详解

作者:admin

来源:lanyunwork

时间:2025-11-18

分享到:

一、核心问题:高频事件的性能隐患

在前端中,以下事件可能被高频触发:
若直接在事件回调中执行复杂操作(如渲染列表、发送请求),会导致:
防抖和节流通过限制函数执行频率解决上述问题,但策略不同。

二、防抖(Debounce):「触发后等待,频繁触发则重置等待」

核心逻辑

事件触发后,延迟 N 秒执行回调;若 N 秒内再次触发事件,则重新计时(覆盖之前的延迟),直到最后一次触发后等待 N 秒,才执行一次回调。
简单说:“等用户‘停手’后再执行,中间的频繁操作都不算”

实现方式(两种版本)

1. 非立即执行版(默认常用)

触发事件后,不立即执行,等待 N 秒后执行;若期间再次触发,重新计时。

2. 立即执行版

触发事件后立即执行一次,之后 N 秒内再次触发不执行;N 秒后触发,重复此逻辑。

适用场景

  • 搜索框输入联想:用户连续打字时,无需每次输入都发请求,等停止输入后 100-300ms 再请求(非立即版)。
  • 按钮防重复提交:点击按钮后立即执行一次,1 秒内再次点击无效(立即版)。
  • 表单验证:输入框内容变化时,等用户暂停输入后再验证格式。

三、节流(Throttle):「固定间隔内,只执行一次」

核心逻辑

事件触发后,立即执行一次回调,然后在接下来的 N 秒内,无论事件触发多少次,都不再执行;N 秒后再次触发事件,重复此逻辑。
简单说:“不管触发多频繁,每隔 N 秒只执行一次”

实现方式(两种版本)

1. 时间戳版

通过记录上次执行时间,每次触发时判断当前时间与上次执行时间的间隔是否超过 N 秒,超过则执行。
特点:首次触发立即执行,最后一次触发若未到间隔则不执行。

2. 定时器版

通过定时器保证每隔 N 秒执行一次,若触发时已有定时器,则等待定时器执行后再重置。
特点:首次触发延迟 N 秒执行,最后一次触发会确保执行。

适用场景

四、防抖与节流的核心区别

五、实际开发中的使用建议

  1. 优先使用成熟库:lodash 提供了 _.debounce 和 _.throttle 函数,处理了 this 指向、参数传递、立即执行等细节,推荐直接使用。

  1. 自定义实现注意点
    • 保留 this 指向(使用 apply/call)。
    • 传递事件参数(如 event 对象)。
    • 支持取消功能(如手动清除定时器)。
  2. 合理设置延迟 / 间隔
    • 防抖延迟:输入类事件建议 100-300ms,按钮防重复提交建议 1000ms。
    • 节流间隔:滚动 /resize 建议 100-200ms,高频交互建议 50-100ms。

总结

防抖和节流是前端性能优化的基础手段,核心是通过限制函数执行频率,减少无效操作。记住:

业务咨询

微信咨询

请扫二维码
咨询项目经理

400电话

4001-355-360

获取方案

与蓝韵项目经理通话

请输入正确的手机号码格式

信息保护中请放心填写

在线咨询
 
提交成功
关闭浮窗