前端学习日记 - 前端函数防抖详解

前端学习日记 - 前端函数防抖详解

前端函数防抖详解

在现代 Web 应用中,函数防抖(debounce)是一种常见且高效的性能优化手段,用于限制高频事件触发下的函数调用次数,从而减少不必要的计算、网络请求或 DOM 操作。本文将从“为什么使用防抖”切入,介绍典型的应用场景,深入解析防抖原理,并给出从零实现到在实际项目中使用 Lodash 的完整代码示例,帮助你快速掌握前端防抖技术。

在这里插入图片描述

为什么使用防抖

函数防抖的核心思想是在连续触发的事件停止后,仅执行最后一次调用,以避免频繁触发带来的性能问题 ([MDN Web Docs][1])。
在不使用防抖的情况下,例如在 input 输入事件或 window.resize 事件中直接调用逻辑,页面可能会因短时间内大量调用而出现卡顿或请求风暴 ([GeeksforGeeks][2])。
通过防抖,可以让函数在用户停止输入、滚动或调整窗口大小后的一定延迟内才执行,极大提高资源利用效率并提升用户体验 ([Medium][3])。

函数防抖的应用场景

  1. 输入框实时搜索建议
    在用户输入关键词时触发搜索接口,若不加限制,每次 keyup 都会发起请求,极易导致接口压力过大。使用防抖后,只在用户停止输入(如 300ms)后才发送请求,有效降低调用次数 ([自由代码营][4])。
  2. 按钮防连点
    对于提交表单或支付按钮,连续点击可能导致多次提交。给点击事件绑定防抖函数,可在用户短时间内多次点击时只执行一次提交操作 ([DEV Community][5])。
  3. 窗口大小调整(resize)
    当页面布局需根据窗口大小实时计算或重绘时,resize 事件会频繁触发,添加防抖能减少重绘次数,提升性能 ([Medium][6])。
  4. 滚动监听
    结合无限滚动或懒加载,当用户滚动页面时应控制数据加载频率,避免重复请求或过度渲染 ([Medium][3])。

函数防抖原理与手写实现

原理

防抖函数通过内部维护一个定时器 ID,每次调用时先清除之前的定时器,再启动一个新的延迟执行定时器;只有在最后一次调用后的延迟时间到达后,才真正执行目标函数 ([GeeksforGeeks][2], [Gist][7])。

手写实现

/** * 简易版防抖函数 * @param {Function} func - 需要防抖的函数 * @param {number} wait - 延迟时间(毫秒) * @returns {Function} - 防抖后返回的新函数 */functiondebounce(func, wait){let timeoutId;// 声明定时器 IDreturnfunction(...args){// 返回一个闭包函数clearTimeout(timeoutId);// 清除上一次定时器 timeoutId =setTimeout(()=>{// 启动新的定时器func.apply(this, args);// 延迟执行目标函数}, wait);};}

上述代码利用 JavaScript 闭包,让每个防抖函数维护独立的 timeoutId,在多次调用时只有最后一次延迟结束后触发 ([Stack Overflow][8])。

使用 Lodash 的 _.debounce

在实际项目中,为了减少手写错误并获得更丰富的功能(如 leadingtrailingcancelflush 等选项),推荐使用成熟的工具库 Lodash 的 _.debounce 方法 ([Lodash][9])。

# 安装 lodash.debounce 子模块npminstall lodash.debounce 
import debounce from'lodash.debounce';/** * 在搜索框中使用防抖 * 当用户停止输入 300ms 后才触发搜索 */const searchInput = document.getElementById('search');functiononSearch(query){// 发送搜索请求 console.log('搜索关键词:', query);}const debouncedSearch =debounce(onSearch,300,{ leading:false, trailing:true}); searchInput.addEventListener('input',(e)=>{debouncedSearch(e.target.value);});
  • leading: 是否在延迟开始前调用一次,默认 false
  • trailing: 是否在延迟结束后调用一次,默认 true
  • 返回的函数还拥有 cancel()flush() 方法,可在需要时取消或立即执行待定调用 ([GeeksforGeeks][10])。

完整示例:防抖搜索组件

下面给出一个完整的示例,包括 HTML、样式与 JavaScript 代码,你可以直接复制运行:

<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>Debounce Demo</title><style>body{font-family: sans-serif;padding: 2rem;}#results{margin-top: 1rem;}.item{padding: 0.5rem 0;border-bottom: 1px solid #eee;}</style></head><body><h1>Debounce 搜索示例</h1><inputid="search"type="text"placeholder="输入关键词…"autocomplete="off"/><divid="results"></div><scripttype="module">import debounce from'lodash.debounce';const search = document.getElementById('search');const results = document.getElementById('results');// 模拟异步搜索函数asyncfunctionfetchResults(query){// 假数据return['苹果','香蕉','橘子','西瓜'].filter(item=> item.includes(query));}asyncfunctionhandleSearch(query){const list =awaitfetchResults(query); results.innerHTML = list.map(item=>`<div>${item}</div>`).join('');}// 300ms 防抖,禁止 leading,允许 trailingconst debouncedHandle =debounce(handleSearch,300,{ leading:false}); search.addEventListener('input',e=>{const q = e.target.value.trim();if(q)debouncedHandle(q);else results.innerHTML ='';});</script></body></html>

结语

函数防抖是前端性能优化中的一项基础技术,适用于各种需要限制高频事件调用的场景,通过简单的定时器逻辑或成熟的 Lodash 工具库,就能快速落地。掌握防抖和其“兄弟”节流(throttle),能让你的应用在面对频繁用户交互时依然保持流畅、稳定。欢迎在项目中实践并根据业务需求调整参数,实现更灵活的性能优化。

Read more

Vue与C++:前端与系统开发的差异

好的,我们来分析一下Vue和C++的区别: 1. 用途与领域 * Vue:是一个用于构建用户界面的渐进式 JavaScript 框架。它主要用于开发Web前端的单页面应用。核心是帮助开发者高效地构建和维护复杂的、交互式的网页界面,处理视图层和数据绑定。 * C++:是一种通用的、编译型的编程语言。它几乎可以用于开发任何类型的软件,包括操作系统、游戏引擎、桌面应用、高性能服务器后端、嵌入式系统、科学计算等。它更接近硬件,提供对系统资源的底层控制。 2. 语法与特性 * Vue: * 基于HTML模板或JSX(类似HTML的语法扩展)来声明式地描述UI。 * 核心特性包括响应式数据绑定(数据变化自动更新视图)、组件系统(将UI拆分为独立可复用的单元)、指令(如v-if, v-for等,用于操作DOM)。 * 语法相对简单直观,易于上手,侧重于声明式地描述“界面应该是什么样子”。 * C++: * 语法复杂,需要显式声明变量类型(强类型语言),支持面向对象编程(类、继承、

前端常用加密方式使用

前端常用加密方式使用

文章目录 * 1、Base64 编码 * 2、MD5 加密 * 3、SHA-256 加密 * 4、AES 对称加密(常用) * 5、RSA 非对称加密(常用) * 6、什么是对称和非对称加密 * 7、什么是哈希算法 * 1. 核心特征 * 2. 常见算法 * 3. 前端/网络中的典型用途 * 4. 不是加密 1、Base64 编码 Base64 不是一种加密算法,而是一种编码方法,用于将二进制数据转换为基于 64 个可打印字符的文本字符串。它常用于在 URL、Cookie、网页中传输少量二进制数据,以及内嵌小图片以减少服务器访问次数。 Base64 编码简单,对性能影响不大,但会增加数据体积约 1/

Shannon:让 AI 替你当黑客,自动找出 Web 应用的真实漏洞

Shannon:让 AI 替你当黑客,自动找出 Web 应用的真实漏洞

Shannon:让 AI 替你当黑客,自动找出 Web 应用的真实漏洞 你的代码每天都在更新,但渗透测试一年只做一次?Shannon 来填补这 364 天的安全空白。 了解 Shannon Shannon 是一个全自动 AI 渗透测试工具,由 Keygraph 团队开源(AGPL-3.0 协议)。它不是传统的漏洞扫描器——它模拟真正的黑客行为,自主分析你的源代码,操控浏览器执行真实攻击,最终交付一份的渗透测试报告。 在 XBOW 基准测试中,Shannon Lite 取得了 96.15% 的成功率。GitHub 上已获得 10.6k Star,是近期安全领域最受关注的开源项目之一。 运行原理 Shannon 模拟人类渗透测试人员的工作方法,采用多智能体架构,分四个阶段执行:

前端未死,AI只是进化的序章

前端未死,AI只是进化的序章 关键词 核心关键词:前端开发、AI取代程序员、前端工程师不可替代、前端职业转型、前端架构思维 摘要 最近,社交媒体上充斥着“前端已死”“AI 取代程序员”的消息,这种焦虑像野火一样在技术圈蔓延——无论是硅谷的科技社群,还是北京、上海、深圳等国内互联网核心城市的开发者圈子,几乎每个前端从业者都能感受到这份不安。作为深耕技术创新、见证过无数行业变革的同行,我太懂这种如芒在背的忐忑:当看到AI几秒钟就能生成一个漂亮的React组件,甚至是一个完整的Landing Page时,每个程序员心里都会咯噔一下:“我的价值,真的会被机器替代吗?” 但请记住,杂音往往是为了博取流量,而真相通常隐藏在进化的路径中。就像当年个人电脑兴起时,有人说“大型机时代结束,程序员无用武之地”;互联网普及初期,有人担忧“静态网页会取代前端开发”——每一次技术迭代,都伴随着类似的焦虑狂欢。今天,我们不妨沉下心来,以理性为尺,拆解这场关于“前端天塌了”的伪命题,找到属于前端从业者的进化答案。