深入理解前端防抖(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

亲测VibeThinker-1.5B-WEBUI:AIME解题效果惊艳

亲测VibeThinker-1.5B-WEBUI:AIME解题效果惊艳 你有没有试过对着一道AIME真题盯了二十分钟,草稿纸写满三页却卡在关键一步?有没有在Codeforces比赛倒计时五分钟时,突然想不起那个最优的DP状态转移方程?我也有。直到上周,我在ZEEKLOG星图镜像广场点开VibeThinker-1.5B-WEBUI,输入第一道AIME24第12题——三分钟后,屏幕上跳出完整推导、清晰注释和最终答案。不是冷冰冰的数字,而是一段像人类教练一样边讲边算的解题过程。 这不是GPT-4或Claude的云端调用,而是跑在我本地RTX 3060上的一个仅1.5B参数的模型。它不聊天气,不写情书,就专注做一件事:把数学题拆开、嚼碎、再一步步拼回正确答案。今天这篇实测笔记,不讲参数量对比,不列训练成本曲线,只说它在真实解题场景里——到底有多好用。 1. 部署极简:三步启动,五秒加载 VibeThinker-1.5B-WEBUI的部署体验,彻底刷新了我对“小模型”的理解。它不像动辄要配8张A100的庞然大物,而更像一个即插即用的解题U盘。 1.1 一键式环境准备 镜像已预装全部

Qwen3-0.6B-FP8实战教程:构建跨平台AI助手——Web/Telegram/Discord多端统一后端

Qwen3-0.6B-FP8实战教程:构建跨平台AI助手——Web/Telegram/Discord多端统一后端 1. 开篇:为什么需要一个多端统一的AI助手? 想象一下这个场景:你正在电脑前写代码,突然想到一个问题,于是打开浏览器,访问一个AI对话页面提问。过了一会儿,你出门了,在手机上收到朋友的消息,想用同一个AI助手帮忙想个点子,却不得不切换到另一个App。晚上,你和团队在Discord上讨论项目,又想调用AI来辅助决策,结果发现还得重新部署一套服务。 是不是很麻烦?这就是我们今天要解决的问题。 Qwen3-0.6B-FP8是一个小巧但强大的语言模型,它能在资源有限的环境下流畅运行。但光有模型还不够,我们需要一个能同时服务Web页面、Telegram机器人和Discord机器人的统一后端。这样,无论你在哪里,用什么设备,都能无缝使用同一个AI助手。 这篇文章,我就带你一步步搭建这样一个系统。不需要高深的编程知识,跟着做就行。 2. 环境准备与模型部署 2.1 你需要准备什么 在开始之前,确保你有以下环境: * 一台Linux服务器:可以是云服务器,也可以是

阿里通义Z-Image-Turbo WebUI风格迁移实战:快速打造品牌视觉形象

阿里通义Z-Image-Turbo WebUI风格迁移实战:快速打造品牌视觉形象 对于初创公司而言,建立统一的品牌视觉形象是提升市场竞争力的关键,但传统设计流程往往需要投入大量时间和人力成本。阿里通义Z-Image-Turbo WebUI风格迁移技术提供了一种高效解决方案,通过AI技术快速生成符合品牌调性的图像,保持视觉一致性。这类任务通常需要GPU环境支持,目前ZEEKLOG算力平台提供了包含该镜像的预置环境,可快速部署验证。 什么是阿里通义Z-Image-Turbo WebUI风格迁移 阿里通义Z-Image-Turbo WebUI是基于阿里云通义实验室最新图像生成技术构建的Web用户界面,其核心能力是通过风格迁移技术将参考图片的视觉特征(如色彩搭配、纹理样式、构图比例等)快速应用到新生成的图片上。 主要解决三类问题: * 品牌视觉一致性:将企业LOGO、主色调、设计语言等特征批量应用到宣传物料 * 设计资源复用:基于少量样本图片快速生成同风格系列作品 * 创意效率提升:10分钟内产出原本需要专业设计师数小时完成的方案 提示:风格迁移不同于普通AI绘图,它能精确

Web Crawling 网络爬虫全景:技术体系、反爬对抗与全链路成本分析

Web Crawling 网络爬虫全景:技术体系、反爬对抗与全链路成本分析

核心结论:爬虫生态数万个工具的繁荣不是技术丰富的标志,而是持续对抗中高损耗率的副产品。爬虫问题的本质不是"能不能爬到",而是全链路成本函数——爬、存、ETL、维护——谁先扛不住。 一、爬虫技术体系全景 1.1 技术类别收敛图 工具数万,但底层技术类别高度收敛。整个爬虫技术栈可以压缩为以下几层: ┌──────────────────────────────────────────────────────┐ │ 应用层(目标适配) │ │ 针对特定网站的解析规则、登录流程、分页逻辑 │ ├──────────────────────────────────────────────────────┤ │ 解析层(数据提取) │ │ HTML解析、JSON提取、正则、XPath、CSS选择器 │ ├──────────────────────────────────────────────────────┤ │ 渲染层(页面执行) │ │ 静态请求(requests/httpx)vs 动态渲染(浏览器引擎) │ ├─────────────────────────────────