0

0

什么是防抖和节流_如何优化事件处理性能【教程】

幻影之瞳

幻影之瞳

发布时间:2026-01-24 00:09:16

|

294人浏览过

|

来源于php中文网

原创

防抖是“等停手再执行”,节流是“保底节奏”;防抖适用于只关心最终值的场景,节流适用于必须响应过程的场景;二者均需正确清除定时器、绑定this、独立实例化,且返回新函数须赋值使用。

什么是防抖和节流_如何优化事件处理性能【教程】

防抖 debounce:不是“延迟执行”,而是“等停手再执行”

防抖不是简单加个 setTimeout 就完事——它本质是「取消重来」的策略。用户连续输入、拖拽或缩放窗口时,你并不需要每一下都响应,而是只关心他最终停下来那一刻的状态。

常见错误现象:
• 搜索框输完立刻发请求,但用户还在打字,结果发了 5 次请求,后 4 次全白费
resize 监听里直接查 DOM 宽高,页面卡顿甚至崩溃
• 定时器没清干净,导致旧回调在新逻辑之后执行,数据错乱

  • 正确做法:每次触发前必须 clearTimeout(timeoutId),否则上一个定时器仍会执行
  • 参数 delay 推荐 150–300ms:太小(如 50ms)几乎不起作用;太大(如 1s)用户能明显感知延迟
  • 注意 this 和参数传递:用 func.apply(this, args),别写成 func(args)(会丢上下文和展开参数)

节流 throttle:不是“限制次数”,而是“保底节奏”

节流适用于那些你必须「过程中响应」的场景,比如滚动定位、鼠标轨迹、Canvas 动画。它不等用户停下,而是强制让回调按固定节奏跑——哪怕用户狂滚 1 秒,你也只执行 10 次(假设间隔 100ms)。

常见错误现象:
• 纯时间戳版 throttle 在用户快速滚动到底部后突然停下,最后位置没更新(漏掉结尾)
• 纯定时器版堆起多个未执行任务,松手后连发几下,体验断续
• 多个元素共用同一个 throttle 函数,计时互相干扰(比如两个滚动容器抢同一个 lastCall

秘塔AI搜索
秘塔AI搜索

秘塔AI搜索,没有广告,直达结果

下载
  • 推荐组合实现:用时间戳判断是否该执行 + 定时器兜底保证结尾不丢失
  • 每个独立监听源应有自己实例:不要 const handleScroll = throttle(fn, 100) 后绑给多个元素;要为每个元素单独调用 throttle
  • 若依赖实时坐标(如拖拽),throttle 可能视觉卡顿,此时优先考虑 requestAnimationFrame

选错就白优化:debounce vs throttle 的关键决策点

这不是性能“银弹”,选错反而更糟——比如用 debounce 做滚动加载,用户已经划过“加载更多”区域才发起请求;用 throttle 做搜索联想,用户停手后还继续发前几次的请求,浪费带宽又返回过期结果。

  • debounce 当:只关心最终值(输入完成、窗口调完、表单填完)
  • throttle 当:必须响应过程(滚动位置、拖拽坐标、绘图帧)
  • 需要首尾都响应?Lodash 的 throttle(func, wait, { leading: true, trailing: true }) 可以,但原生实现需手动补全逻辑

实际部署时最易忽略的一件事

防抖和节流函数返回的是**新函数**,必须赋值后绑定到事件上,不能直接调用。写成 window.addEventListener('scroll', throttle(handleScroll, 100)()) 是错的——多了一对括号,等于立即执行并返回 undefined

还有:它们不解决回调函数本身低效的问题。如果 handleScroll 里反复 document.querySelector 或强制同步布局,再好的节流也救不了。先优化函数体,再套控制层。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

5214

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

3019

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

251

2025.12.25

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3176

2024.08.14

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

508

2023.10.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 50万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号