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

obsidian ai/copilot 插件配置

Obsidian AI 插件安装与 API 配置教程 以下是在 Obsidian 中安装支持 AI 的插件并配置智谱清言、通义千问、DeepSeek、Kimi 以及 GitHub 免费 GPT 接口的详细教程。 安装流程 1. 安装 Obsidian 1. 下载 Obsidian: * 访问 Obsidian 官网,下载适用于你的操作系统的版本(Windows、macOS、Linux)。 * 按照提示完成安装。 2. 创建或打开 Vault: * 打开 Obsidian,选择或创建一个新的 Vault(工作空间)用于存储笔记。 2. 安装 AI 插件 1. 启用社区插件: * 打开 Obsidian,

Obsidian 看板 + Copilot:项目管理与每日总结的完美闭环

Obsidian 看板 + Copilot:项目管理与每日总结的完美闭环

在多项目并行的职场节奏中,项目管理是每个人的必修课。我曾深陷“工具选择困难症”,在滴答清单、Notion 等工具间反复横跳。虽然滴答清单足够优秀,但它始终无法与我的个人知识库深度联动,更难以调用 AI 能力来二次加工我的工作轨迹。 今天,我想分享一套基于 Obsidian 看板 + Copilot 的全自动化项目管理工作流。 核心思路 All in One 的自动化闭环这套工作流的核心在于利用 Obsidian 的“万物皆 Markdown”特性。看板文件本质上是 Markdown 列表,通过插件自动记录的时间戳,我们可以让 Copilot 扮演“私人秘书”,瞬间完成从“任务执行”到“复盘总结”。 必备插件 在 Obsidian 插件市场安装以下三个插件: * Kanban:提供直观的看板视图。 * Tasks:自动为完成的任务打上时间戳。 * Copilot:调用

无需任何拓展Copilot接入第三方OpenAI接口教程

禁止搬运,转载需标明本文链接 省流:修改"C:\Users\你的用户名称\.vscode\extensions\github.copilot-chat-0.35.0\package.json"中的"when": "productQualityType != 'stable'"为"when": "productQualityType == 'stable'",即可在copilot添加支持openAI的第三方接口 我在寻找怎么让copilot接入第三方接口的时候,通过别人的贴子(长期有效)接入第三方 OpenAI 兼容模型到 GitHub Copilot-ZEEKLOG博客发现了官方的讨论Add custom OpenAI endpoint configuration

Copilot使用体验

本篇是去年使用Copilot的记录,不代表目前水平,仅做个人记录同步,谨慎参考。 GitHub Copilot的订阅计划 https://docs.github.com/en/copilot/about-github-copilot/subscription-plans-for-github-copilot 个人版提供30天的免费试用。个人版每月10 美元或每年 100 美元。 Copilot操作文档 https://docs.github.com/en/copilot/quickstart 目前支持JetBrains IDEs,Vim/Neovim,Visual Studio,Visual Studio Code,Xcode。安装插件,登录Github账号就可以使用了,需要开代理。 基本操作 * 获取代码建议,输入代码时会自动触发,使用“Tab”键采纳。 * 切换建议,macOS使用“Option+]”或“