讲师中心 微信公众号
AI工具推荐 视频效率加速

防抖和节流的机制分别是什么?如何实现?

陌芳大大_6067

陌芳大大_6067

发布时间:2026-01-15 14:17:41

|

440人浏览过

|

来源于php中文网

原创

防抖是事件停止触发后延迟执行最后一次调用,节流是固定时间间隔内最多执行一次;二者均用于优化高频事件性能,另有时间戳+定时器组合节流、requestAnimationFrame节流及Lodash封装实现。

防抖和节流的机制分别是什么?如何实现? - php中文网

防抖和节流是前端开发中用于控制高频事件触发频率的两种核心策略。它们在处理如 resize、scroll、input、mousemove 等连续触发事件时,能有效避免函数被过度调用,从而提升性能与响应稳定性。以下是两种机制的原理说明与具体实现方式:

一、防抖的机制与实现

防抖的机制是:**在事件被频繁触发时,仅执行最后一次触发所对应的函数调用,中间所有触发均被忽略**。其实质是每次触发都重置计时器,只有当事件停止触发且超过设定延迟后,才真正执行函数。

1、定义一个函数,接收原函数 fn 和延迟时间 delay 作为参数。

2、在函数内部声明一个 timer 变量用于存储定时器 ID。

3、返回一个闭包函数,在其内部先清除已存在的定时器(clearTimeout(timer))。

4、再使用 setTimeout 设置新的延时任务,延迟执行 fn,将 timer 赋值为该定时器 ID。

5、若需支持立即执行模式(首次触发即执行,后续连续触发则重置),可在闭包中增加 leading 参数判断逻辑,并通过首次标记与定时器状态协同控制。

二、节流的机制与实现

节流的机制是:**限制函数在指定时间间隔内最多执行一次,无论事件触发多少次,都按固定节奏执行**。其实质是在函数执行后锁定一段时间,在锁定期内忽略新触发,锁定结束才允许下一次执行。

1、定义一个函数,接收原函数 fn 和间隔时间 delay 作为参数。

2、在函数内部声明一个变量 lastTime 记录上一次执行的时间戳(初始为 0)。

3、返回一个闭包函数,在其内部获取当前时间戳 currentTime。

4、判断 currentTime - lastTime 是否大于等于 delay,若成立,则执行 fn 并更新 lastTime = currentTime。

5、若需支持时间戳+定时器双模式(更平滑的节流效果),可额外维护一个 timer 变量,当 timer 存在时不启动新定时器,待 timer 执行完毕后再清空并允许下一轮调度。

三、基于时间戳与定时器组合的节流实现

该方式兼顾执行时机可控性与响应及时性,避免纯时间戳模式在事件停止后无法触发末次调用的问题,也规避纯定时器模式在事件持续触发时始终不执行首尾的问题。

1、定义函数,接收 fn、delay 和可选 options(含 leading、trailing 配置)。

2、初始化 timer = null、lastTime = 0。

精英前端设计-专业版
精英前端设计-专业版

企业级前端设计系统,支持多页面应用、React/Vue组件、品牌一致性与高级动效编排。

下载

3、在闭包中获取 currentTime,计算剩余等待时间 remaining = delay - (currentTime - lastTime)。

4、若 remaining delay(时间倒流校验),则立即执行 fn 并更新 lastTime;否则若 timer 不存在且 trailing 为 true,则设置 setTimeout 延迟执行 fn。

5、若 leading 为 false 且 timer 不存在,则在首次触发时启动定时器,确保至少有一次执行机会。

四、使用 requestAnimationFrame 的轻量节流实现

requestAnimationFrame 是浏览器专门为动画优化的 API,其回调函数会在下一次重绘前执行,天然具备约 16ms 的帧率限制特性,适合对视觉反馈要求高的场景(如 scroll、mousemove 的位置同步)。

1、定义一个函数,接收 fn 作为参数。

2、声明一个变量 isRequesting = false 用于标识当前是否已有 rAF 请求待执行。

3、返回闭包函数,在其内部若 isRequesting 为 false,则设为 true 并调用 requestAnimationFrame。

4、在 rAF 回调中执行 fn,完成后将 isRequesting 设为 false,允许下次触发进入队列。

5、该方式无需手动管理时间间隔,自动适配屏幕刷新率,且不会造成丢帧或强制同步阻塞。

五、Lodash 库中的 debounce 与 throttle 函数调用方式

Lodash 封装了健壮的防抖与节流实现,支持最大延迟、取消、刷新、pending 状态查询等扩展能力,适用于生产环境快速集成。

1、通过 npm install lodash 安装依赖,或使用 CDN 引入。

2、使用 import { debounce, throttle } from 'lodash' 导入对应函数。

3、对目标函数进行包装:const debouncedFn = debounce(handler, 300, { leading: false, maxWait: 500 })。

4、对节流函数可配置 options:const throttledFn = throttle(handler, 100, { leading: true, trailing: true })。

5、调用 debouncedFn.cancel() 可立即清除待执行的防抖任务;throttledFn.flush() 可强制执行挂起的节流回调。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

c语言const用法
c语言const用法

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

2378

2023.09.20

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

4913

2025.07.29

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

934

2023.11.24

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

20

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

20

2026.11.04

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

20

2026.11.04

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn