javascript中什么是防抖和节流_它们如何提升性能【教程】
发布时间 - 2026-01-28 00:00:00 点击率:次防抖与节流是事件响应策略:防抖只执行最后一次触发(如搜索框停顿后请求),节流则按固定间隔执行(如滚动中每200ms检查位置),二者均用于避免高频无意义调用,而非直接优化CPU或内存性能。
防抖和节流不是“性能优化技巧”,而是「事件响应策略」
它们不直接提升 CPU 或内存性能,而是防止函数被高频、无意义地调用——比如用户狂输 10 个字,input 事件触发 10 次,你却发了 10 次搜索请求;或者拖拽窗口时 resize 每毫秒触发几十次,你却反复重算 DOM 尺寸。真正拖慢页面的,是这些本可跳过的逻辑执行,而非事件本身。
防抖:debounce(fn, delay) —— 只信“最后一击”
每次触发都清掉旧定时器,只在停止触发 delay 毫秒后执行一次。适合“结果比过程重要”的场景:
- 搜索框联想:用户打完 “react” 停顿 300ms 后才查,中间删改都不发请求
- 表单校验(邮箱格式):输入中不提示,光标移出或停顿时再验
- 按钮防重复提交:点击后立刻禁用 + 防抖,避免双击触发两次 API
⚠️ 容易踩的坑:
-
debounce返回的是新函数,不能在addEventListener里每次写debounce(handleInput, 300),否则每次渲染都新建闭包,clearTimeout失效 → 必须提前定义并复用:const debouncedInput = debounce(handleInput, 300) - 没传
this和参数:原始事件回调里的this是 DOM 元素,但防抖函数里会丢失 → 必须用fn.apply(this, arguments)或展开参数 -
delay设太小(如 50ms)≈ 没防抖;设太大(如 800ms)用户会明显感知延迟 → 搜索建议推荐 200–300ms,表单校验可设 400–500ms
节流:throttle(fn, interval) —— 要“节奏感”,不要“全漏掉”
保证函数至少每 interval 毫秒执行一次,不管触发多密。适合“需要感知过程但不能太密”的交互:
-
scroll监听吸顶或懒加载:滚动中每 200ms 检查一次 scrollTop,既不卡顿也不错过关键位置 - 鼠标拖拽更新坐标:canvas 绘图、自定义 slider,不需要每帧都算,16ms(60fps)或 50ms 更合理
-
mousemove实时预览:避免鼠标划过时疯狂重绘缩略图
⚠️ 容易踩的坑:
- 时间戳版(推荐)首次立即执行,但若需“首次也等间隔”,得用定时器版(带
leading/trailing控制) - 别把
interval设成 0 或负数 —— 会导致无限循环或不执行 - 在 Vue/React 中,别在
render或useEffect里动态生成节流函数,同样会破坏引用稳定性 → 应提至组件外或用useCallback缓存
选错就等于交互逻辑错:防抖 vs 节流,本质是业务语义问题
不是“哪个更快”,而是“你要响应什么”:
- 用户 resize 窗口:用防抖 —— 等他拖完再重排布局,稳
- 用户 scroll 页面想实时显示
“已滚动高度百分比”:用节流 —— 防抖会卡住不动,直到他停手,体验断层
- 游戏里按空格射击:用节流(
interval=200ms)限制射速,不是防抖 —— 防抖会让连按变单发,节流才能实现“每 200ms 最多一发”的节奏
真实项目中,lodash 的 _.debounce 和 _.throttle 已处理取消、立即执行、this 绑定等边界,比手写更可靠;但前提是理解它们为何这样设计 —— 否则连配置项都看不懂,比如 leading: true 是啥意思,maxWait 解决什么问题。
# vue
# react
# javascript
# java
# app
# 懒加载
# 联想
# ai
# 邮箱
# 重绘
# canva
# const
# 循环
# 闭包
# 事件
# dom
# this
# canvas
# input
# 性能优化
# 防抖
# 鼠标
# 首次
# 而非
# 表单
# 你却
# 无意义
# 的是
# 拖拽
# 也不
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现API速率限制?(Rate Limiting教程)
如何在腾讯云免费申请建站?
详解Oracle修改字段类型方法总结
如何有效防御Web建站篡改攻击?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
如何快速辨别茅台真假?关键步骤解析
java ZXing生成二维码及条码实例分享
如何在建站之星绑定自定义域名?
*服务器网站为何频现安全漏洞?
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Android利用动画实现背景逐渐变暗
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
详解jQuery停止动画——stop()方法的使用
Laravel如何实现模型的全局作用域?(Global Scope示例)
Laravel安装步骤详细教程_Laravel环境搭建指南
JavaScript Ajax实现异步通信
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
🚀拖拽式CMS建站能否实现高效与个性化并存?
如何在IIS中配置站点IP、端口及主机头?
JavaScript如何实现路由_前端路由原理是什么
如何快速搭建高效香港服务器网站?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
如何在服务器上三步完成建站并提升流量?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
高端建站三要素:定制模板、企业官网与响应式设计优化
韩国服务器如何优化跨境访问实现高效连接?
Laravel怎么连接多个数据库_Laravel多数据库连接配置
微信小程序 wx.uploadFile无法上传解决办法
网站制作软件有哪些,制图软件有哪些?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
iOS中将个别页面强制横屏其他页面竖屏
网站制作价目表怎么做,珍爱网婚介费用多少?
如何用已有域名快速搭建网站?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
如何为不同团队 ID 动态生成多个“认领值班”按钮
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
Laravel怎么实现验证码(Captcha)功能
如何用美橙互联一键搭建多站合一网站?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
Laravel如何使用Blade组件和插槽?(Component代码示例)
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
如何做网站制作流程,*游戏网站怎么搭建?
javascript基本数据类型及类型检测常用方法小结
如何在阿里云虚拟主机上快速搭建个人网站?
深圳网站制作的公司有哪些,dido官方网站?
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
个人网站制作流程图片大全,个人网站如何注销?


