新闻中心
J*ascript如何实现防抖与节流?
防抖是最后一次触发后延迟执行,节流是固定间隔内最多执行一次;防抖适用于搜索输入等需等待操作结束的场景,节流适用于滚动监听等需稳定采样节奏的场景。

防抖和节流是前端处理高频事件(比如 resize、scroll、input)的两个核心优化手段,目的都是减少函数实际执行次数,但逻辑不同:防抖是“等你停了再执行”,节流是“固定频率执行”。
防抖(Debounce):最后一次触发后延迟执行
适用于搜索框输入联想、窗口大小调整后重新布局等场景——用户连续操作时,只响应最后那次。
关键点:每次触发都清除之前的定时器,重新设置新定时器。
- 用
setTimeout+clearTimeout实现 - 支持立即执行模式(首次触发立刻运行,后续触发按规则等待)
- 注意
this和参数的正确传递
基础实现:
立即学习“J*a免费学习笔记(深入)”;
function debounce(func, wait, immediate = false) {
let timeout;
return function(...args) {
const later = () => {
timeout = null;
if (!immediate) func.apply(this, args);
};
const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(this, args);
};
}
节流(Throttle):固定间隔内最多执行一次
适合滚动监听、鼠标拖拽等需要持续反馈但不必每帧都处理的场景——像“每隔 100ms 最多执行一次”。
关键点:区分“定时器控制”和“时间戳控制”两种主流写法,前者更常用且易于理解。
- 定时器版:用
setTimeout控制是否处于“冷却中” - 时间戳版:记录上一次执行时间,当前时间减去它大于等待时间才执行
- 两者在首次/末次触发行为上略有差异,可根据需求选择
定时器版节流示例:
Blackink AI纹身生成
创建类似纹身的设计,生成独特纹身
80
查看详情
function throttle(func, wait) {
let timeout = null;
return function(...args) {
if (!timeout) {
timeout = setTimeout(() => {
func.apply(this, args);
timeout = null;
}, wait);
}
};
}
实际使用中的细节提醒
防抖和节流函数返回的是新函数,需在事件绑定时调用并赋值,而不是直接传入函数名。
- 错误写法:
input.addEventListener('input', debounce(handleInput, 300))—— 每次都会新建闭包,失去防抖意义 - 正确写法:
const debounced = debounce(handleInput, 300); input.addEventListener('input', debounced) - 记得在组件卸载或销毁时清除定时器(尤其 React useEffect 中),避免内存泄漏
- 现代项目可借助 Lodash 的
_.debounce/_.throttle,它们已处理好 this、取消、返回清理函数等细节
如何选?看业务意图
用户输入搜索关键词 → 防抖(等他打完再查)
监听页面滚动位置做吸顶效果 → 节流(不需要每像素都算,16ms 一帧足够)
表单实时校验 → 防抖(避免用户还没输完就报错)
游戏手柄方向监听 → 节流(保持稳定采样节奏)
基本上就这些。不复杂但容易忽略上下文和清理逻辑。
以上就是J*ascript如何实现防抖与节流?的详细内容,更多请关注其它相关文章!
# 绑定
# 酒店网站建设方案模板
# 柳州去哪找智能营销推广
# 外贸社媒推广营销
# 南昌seo优化诊断
# 新乡外贸网站优化费用低
# 个人博客网站推广问题
# 佳木斯seo营销推荐
# 黄山网络推广营销公司
# 中山推广营销技术
# seo 网络 培训视频
# 的是
# 有什么区别
# 如何使用
# react
# 首次
# 如何实现
# 表单
# 适用于
# 最多
# 防抖
# ai
# 联想
# app
# 前端
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Angular中父组件异步更新子组件复选框状态的实践指南
顺丰快递查单号物流信息 顺丰快递小程序查询入口
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
夸克浏览器图书入口 夸克手机浏览器阅读入口
UC浏览器网页版登录入口官网 电脑版网址入口
随机参数递归函数的基准调用次数与时间复杂度探究
解决J*aScript中重复选择项的确认对话框显示问题
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
Typer应用中动态命令行参数的解析与处理
解决深度学习模型训练初期异常高损失与完美验证准确率问题
葱吃多了会怎样 葱吃多了会伤胃吗
win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
windows10怎么关闭系统提示音_windows10彻底静音设置方法
抖音创作助手登录入口_抖音创作辅助工具官网直达
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
天眼查企业查询官网入口 天眼查官方网页版查询
Go语言HTML解析:利用Goquery精准获取指定元素内容
Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
微博网页版直接访问 微博网页版账号管理快速入口
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
AO3镜像入口大全 AO3网页版内容访问全集
Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏
抖音网页版怎么|直播|_抖音网页版开播操作指南
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
知音漫客官网漫画下载_知音漫客网页版阅读记录
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
jQuery Mask 插件中实现电话号码固定前导零的教程
Python类型检查:优化关联可选属性的Mypy推断策略
抖音从哪里进入网页版_抖音官方入口链接
Tailwind CSS line-clamp 布局问题解析与修复指南
Pygame教程:解决用户输入与游戏状态更新不同步问题
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
将HTML动态表格多行数据保存到Google Sheet的教程
在J*a项目里如何构建对象之间的契约_接口约束的实际落地
在VS Code中配置和运行Dart程序的完整步骤
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
React Router 嵌套组件中 URL 重定向问题的解决方案
QQ官网正版登录链接 QQ在线登录入口最新
Steam官网入口直达 Steam注册及登录步骤
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色


2025-12-15
浏览次数:次
返回列表
timeout = setTimeout(later, wait);
if (callNow) func.apply(this, args);
};
}