javascript防抖是什么_如何用它优化高频触发的事件?
发布时间 - 2025-12-25 00:00:00 点击率:次防抖是通过重置定时器实现“最后一次触发后延迟执行”的技术,适用于搜索输入、resize等需响应终态的场景;其核心是清除旧定时器并新建,支持立即执行选项与this绑定。
防抖(Debounce)是一种限制函数执行频率的技术:当某个事件被高频触发时,它会忽略前面的多次调用,只在最后一次触发后等待一段“静默时间”,若期间不再触发,才真正执行函数。
防抖的核心逻辑
它不是“减少调用次数”,而是“重新计时”。每次事件触发,就清除之前的定时器,新建一个。只有连续触发停止后,倒计时走完,函数才运行一次。
- 适合场景:用户输入搜索、窗口大小调整(resize)、鼠标移动(mousemove)等连续触发但只需响应最终状态的操作
- 关键点:必须有“等待期”和“重置机制”,否则就变成节流或普通延时
- 常见误区:把防抖函数直接赋值给事件监听器却忘了传参或绑定 this,导致执行时上下文丢失或参数为空
手写一个可复用的防抖函数
下面是一个带立即执行选项、支持 this 和参数透传的简洁实现:
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);
};
}
- func:要防抖的目标函数
-
wait:等待毫秒数
,比如 300 表示“停 300ms 后再执行” - immediate:为 true 时,首次触发立刻执行,后续触发则重置计时(常用于按钮防重复点击)
- 使用时建议用
const debouncedHandler = debounce(handler, 300)封装后再绑定事件,避免每次触发都新建函数
实际应用示例:搜索框输入优化
未加防抖时,用户每按一个键就发请求,既浪费资源又可能打乱响应顺序;加了防抖后,只在用户暂停输入时查一次:
const searchInput = document.getElementById('search');
const search = (query) => fetch(`/api/search?q=${query}`); // 真实请求逻辑
// 防抖封装
const debouncedSearch = debounce((q) => {
if (q.trim()) search(q);
}, 400);
searchInput.addEventListener('input', (e) => {
debouncedSearch(e.target.value);
});
- 输入 “hello” 过程中触发 5 次 input 事件,但只在最后停顿 400ms 后请求一次
hello - 如果用户输到 “hel” 就停下,400ms 后请求的是 “hel”,不会等到 “hello”
- 若需取消待执行请求(如上一个请求还没返回,新请求已发起),应在
fetch中配合AbortController使用
和节流(Throttle)的区别
防抖关注“最后一次”,节流关注“固定节奏”。例如滚动监听:
- 用防抖:用户滚完停下来才执行一次(适合更新页面状态、保存滚动位置)
- 用节流:每 100ms 最多执行一次(适合实时计算滚动进度、懒加载)
- 别混用:想“控制频率”选节流,想“响应终态”选防抖
# javascript
# java
# app
# 懒加载
# ai
# 区别
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
香港网站服务器数量如何影响SEO优化效果?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
JavaScript如何实现音频处理_Web Audio API如何工作?
如何快速搭建高效香港服务器网站?
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何在建站主机中优化服务器配置?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
android nfc常用标签读取总结
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
新三国志曹操传主线渭水交兵攻略
如何在服务器上配置二级域名建站?
详解阿里云nginx服务器多站点的配置
微信小程序 require机制详解及实例代码
Laravel如何使用Sanctum进行API认证?(SPA实战)
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
如何在万网自助建站平台快速创建网站?
如何在万网自助建站中设置域名及备案?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
如何在腾讯云免费申请建站?
Laravel如何实现API版本控制_Laravel版本化API设计方案
Angular 表单中正确绑定输入值以确保提交与验证正常工作
简单实现jsp分页
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
如何在建站之星绑定自定义域名?
Laravel怎么判断请求类型_Laravel Request isMethod用法
奇安信“盘古石”团队突破 iOS 26.1 提权
魔毅自助建站系统:模板定制与SEO优化一键生成指南
如何用腾讯建站主机快速创建免费网站?
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
Python高阶函数应用_函数作为参数说明【指导】
node.js报错:Cannot find module 'ejs'的解决办法
如何在阿里云域名上完成建站全流程?
微信小程序 wx.uploadFile无法上传解决办法
活动邀请函制作网站有哪些,活动邀请函文案?
中国移动官方网站首页入口 中国移动官网网页登录
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
北京网站制作的公司有哪些,北京白云观官方网站?
如何在IIS中配置站点IP、端口及主机头?
Android 常见的图片加载框架详细介绍
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】


,比如 300 表示“停 300ms 后再执行”