深入理解前端防抖(Debounce)与节流(Throttle):原理、区别与实战示例

深入理解前端防抖(Debounce)与节流(Throttle):原理、区别与实战示例

深入理解前端防抖(Debounce)与节流(Throttle):原理、区别与实战示例

📌 引言

在前端开发中,我们经常需要处理高频事件(如输入框输入、滚动、窗口调整大小等)。如果不加限制,浏览器会频繁触发回调函数,导致性能问题,甚至页面卡顿

防抖(Debounce)节流(Throttle) 是两种优化方案,可以有效控制事件触发的频率,提高应用的性能和用户体验。

本篇文章将详细解析 防抖和节流的原理、适用场景及代码实现,帮助你更好地优化前端应用。


1. 什么是防抖(Debounce)?

📝 概念

防抖是一种在事件触发后延迟执行的技术,如果在延迟期间事件被再次触发,计时器会重置,重新计算延迟时间。

核心思想短时间内多次触发,只执行最后一次

📌 适用场景

  • 搜索框输入(防止用户每次输入都发送请求)
  • 窗口调整大小(resize)(防止短时间内多次触发计算)
  • 表单输入验证(用户停止输入后再进行验证)

✅ 代码实现

functiondebounce(fn, delay =300){let timer;returnfunction(...args){if(timer)clearTimeout(timer);// 清除之前的定时器 timer =setTimeout(()=>fn.apply(this, args), delay);};}

示例:输入框防抖

<inputtype="text"id="search"placeholder="请输入内容"><script>const input = document.getElementById('search'); input.addEventListener('input',debounce((e)=>{ console.log('搜索内容:', e.target.value);},500));</script>
效果:用户输入停止 500ms 后,才触发 console.log

2. 什么是节流(Throttle)?

📝 概念

节流是一种限定函数执行频率的技术,即在一定时间间隔内,函数最多执行一次,即使事件被频繁触发。

核心思想高频触发,固定间隔执行

📌 适用场景

  • 滚动事件(scroll)(如懒加载、页面滚动监听)
  • 鼠标移动(mousemove)(防止触发过多计算)
  • 按钮点击(click)(防止用户疯狂点击)

✅ 代码实现

functionthrottle(fn, interval =300){let lastTime =0;returnfunction(...args){const now = Date.now();if(now - lastTime >= interval){fn.apply(this, args); lastTime = now;}};}

示例:滚动监听

<divstyle="height: 2000px;"></div><script> window.addEventListener('scroll',throttle(()=>{ console.log('滚动中...',newDate().toLocaleTimeString());},1000));</script>
效果:无论滚动多快,scroll 事件每秒最多执行一次

3. 防抖 vs. 节流:有什么区别?

防抖(Debounce)节流(Throttle)
触发方式事件触发后延迟执行事件触发后间隔执行
特性短时间连续触发,只执行最后一次固定时间间隔内最多执行一次
适用场景输入框输入、搜索框、表单验证滚动、鼠标移动、按钮点击
优势避免无效调用,减少资源消耗保证高频事件可执行,提高流畅度
实现方式setTimeout 延迟执行Date.now() 控制执行间隔

📌 总结

  • 如果你想等用户停止操作后再执行任务,使用防抖(Debounce)
  • 如果你希望控制函数执行的频率,使用节流(Throttle)

4. 进阶优化:使用 Lodash

我们可以直接使用 Lodash 提供的 debouncethrottle 方法,避免自己实现。

✅ Lodash 防抖

npm install lodash 
import _ from'lodash';const handleInput = _.debounce((e)=>{ console.log('防抖触发:', e.target.value);},500); document.getElementById('search').addEventListener('input', handleInput);

✅ Lodash 节流

const handleScroll = _.throttle(()=>{ console.log('节流触发',newDate().toLocaleTimeString());},1000); window.addEventListener('scroll', handleScroll);
Lodash 优势:内部优化更好,支持立即执行leading)和延迟执行trailing)。

5. 结合 Vue 实战应用

📌 Vue 中使用防抖

<template><inputv-model="searchText"@input="handleInput"placeholder="搜索"></template><script>import{ ref }from'vue';import _ from'lodash';exportdefault{setup(){const searchText =ref('');const handleInput = _.debounce((e)=>{ console.log('搜索关键词:', e.target.value);},500);return{ searchText, handleInput };},};</script>
效果:用户停止输入 500ms 后才会触发搜索请求。

📌 Vue 中使用节流

<template><button@click="handleClick">点击节流</button></template><script>import _ from'lodash';exportdefault{setup(){const handleClick = _.throttle(()=>{ console.log('按钮点击',newDate().toLocaleTimeString());},2000);return{ handleClick };},};</script>
效果:按钮每 2s 只能点击一次。

6. 结论

防抖(Debounce)和节流(Throttle) 是前端性能优化的重要技术,合理使用可以显著减少不必要的计算,提高页面流畅度。

适用场景推荐方法
输入框防止频繁请求防抖(Debounce)
窗口调整大小(resize)防抖(Debounce)
滚动事件(scroll)节流(Throttle)
鼠标移动(mousemove)节流(Throttle)
按钮点击(click)节流(Throttle)

Read more

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 目录 DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 前  言 1 环境准备 1.1 华为云开发环境 1.2 ModelArts 代金券与模型服务 1.3 启动 OpenClaw 网关 2 飞书开放平台配置 2.1 创建企业自建应用 2.2 添加机器人能力 2.3 配置应用权限 2.4 发布应用版本 3 OpenClaw 与飞书集成 3.1 配置 OpenClaw

飞书机器人实战:5分钟搞定图片消息发送(含常见报错解决方案)

飞书机器人实战:5分钟搞定图片消息发送(含常见报错解决方案) 你是否遇到过这样的场景:服务器监控系统捕捉到一个异常峰值,你希望它能自动将一张清晰的图表截图,直接推送到团队的飞书群里,而不是一封冰冷的邮件;或者,你的自动化日报系统生成了精美的数据可视化图片,你希望它能无缝地出现在每日的晨会通知中。对于许多开发者和运维工程师来说,将图片消息集成到自动化流程中,是一个能极大提升信息传达效率和体验的“刚需”。 飞书机器人提供了强大的消息推送能力,但初次接触其图片消息发送功能时,你可能会发现它比预想的要“曲折”一些——它不像发送文本那样直接丢一个图片链接就行,而是需要经过一个“上传-获取密钥-发送”的流程。这个过程里,权限配置、tenant_access_token获取、图片上传格式、image_key的使用,每一步都可能藏着一个小坑。别担心,这篇文章就是为你准备的“避坑指南”。我们将抛开官方文档那略显冰冷的步骤罗列,从一个实战者的角度,带你用大约5分钟的时间,彻底打通从零到一发送飞书图片消息的全链路,并重点剖析那些你可能马上就会遇到的报错及其根因解决方案。我们的目标是:让你看完就能用,用了

基于Zynq FPGA对雷龙SD NAND的测试

基于Zynq FPGA对雷龙SD NAND的测试

一、SD NAND 特征 1.1 SD 卡简介 雷龙的 SD NAND 有很多型号,在测试中使用的是 CSNP4GCR01-AMW 与 CSNP32GCR01-AOW。芯片是基于 NAND FLASH 和 SD 控制器实现的 SD 卡。具有强大的坏块管理和纠错功能,并且在意外掉电的情况下同样能保证数据的安全。 其特点如下: * 接口支持 SD2.0 2 线或 4 线; * 电压支持:2.7V-3.6V; * 默认模式: 可变时钟速率 0 - 25MHz,高达 12.5 MB/s 的接口速度 (使用

Cloudflare 防 CC/机器人攻击完整解决方案:用 WAF 托管质询 + “已知自动程序=true” 稳定解决 WordPress CPU/内存 100%

Cloudflare 通用防护目标(只用 Cloudflare,适配所有服务器) 该方案只在 Cloudflare 侧完成,不依赖服务器类型、面板或 root 权限,目标是: 1. 不长期依赖 Under Attack(仅作为应急开关) 2. 通过 WAF 规则把高频机器人/CC 流量挡在边缘 3. 重点保护 WordPress 高风险入口(wp-login、admin-ajax、xmlrpc) 4. 通过事件数据持续迭代规则,保持长期稳定 一、Cloudflare 基础前置(必须) 1. DNS 全部走代理(橙云) * 网站主域名、www 以及对外访问的记录,全部开启 Proxied(橙云) * 不保留任何灰云直连源站记录,避免绕过