在 JavaScript 前端开发中,处理高频率事件(如窗口调整、输入框输入、页面滚动)时,如果不加以控制,会导致性能问题,如页面卡顿或资源浪费。防抖(Debounce)和节流(Throttle)是两种优化策略,用于减少事件触发频率,提升用户体验和性能。

一、防抖(Debounce)详解

        防抖的核心思想是:确保事件触发后,在指定延迟时间内不再触发新事件,才执行函数。如果延迟时间内再次触发事件,则重新计时。这避免了连续触发导致的多次执行,适用于需要“等待用户停止操作”的场景。

1.原理
防抖基于一个计时器(Timer)机制。当事件首次触发时,设置一个定时器(延迟时间为 tt 毫秒)。如果在 tt 毫秒内事件再次触发,则清除之前的定时器并重新设置;只有当 tt 毫秒内无新事件触发时,定时器到期后函数才执行。数学上,这相当于确保函数只在事件序列的“最后一次”触发后执行。
例如:用户输入搜索框时,防抖确保只在停止

2.实现代码
以下是 JavaScript 的防抖函数实现(使用 ES6 语法),包含详细注释:

/*** 防抖函数实现* @param {Function} fn - 需要防抖的函数* @param {number} delay - 延迟时间(毫秒)* @returns {Function} - 返回一个新的防抖函数*/
function debounce(fn, delay) {let timerId = null; // 用于存储定时器IDreturn function(...args) {// 如果已有定时器,则清除它(确保只执行最后一次)if (timerId !== null) {clearTimeout(timerId);}// 设置新定时器:延迟时间后执行原函数timerId = setTimeout(() => {fn.apply(this, args); // 使用 apply 确保 this 上下文正确timerId = null; // 执行后重置定时器ID}, delay);};
}// 使用示例
const handleSearch = debounce(function(event) {console.log('Searching:', event.target.value);// 实际应用:发送搜索请求
}, 500); // 延迟500毫秒document.querySelector('#search-input').addEventListener('input', handleSearch);
  • 代码解释

    • debounce 函数接收一个函数 fn 和延迟时间 delay

    • 内部使用 setTimeout 管理计时器:每次事件触发,先清除旧计时器,再设置新计时器。

    • 使用 apply 确保目标函数 fn this 和参数正确传递。

    • 示例中,输入框的 input 事件被防抖处理:用户停止输入500毫秒后,才执行搜索逻辑。

3.应用场景

  • 搜索框输入:用户输入停止后执行搜索,避免频繁请求服务器1

  • 窗口调整(resize):只在用户停止调整窗口大小时更新布局,减少重绘开销3

  • 表单验证:用户停止输入后才验证,而不是每次按键都触发5

  • 按钮防重复点击:防止用户快速多次点击提交按钮,导致重复提交4

二、节流(Throttle)详解

        节流的核心思想是:在固定时间间隔内,无论事件触发多少次,只执行一次函数。这保证了函数的执行频率可控,适用于需要“均匀执行”的场景。

1.原理
节流使用一个时间戳或计时器来控制执行频率。假设时间间隔为 t 毫秒:当事件首次触发时,立即执行函数并记录时间戳;之后每次触发事件,检查当前时间与上次执行时间的差值,如果差值小于 t,则忽略;如果大于或等于 t,则执行函数并更新时间戳。数学上,这确保函数在时间轴上的执行间隔至少为 t。
例如:页面滚动时,节流确保滚动事件每100毫秒只处理一次,保持动画流畅。

2.实现代码
以下是 JavaScript 的节流函数实现(使用时间戳方式),包含详细注释:

/*** 节流函数实现(时间戳版本)* @param {Function} fn - 需要节流的函数* @param {number} interval - 时间间隔(毫秒)* @returns {Function} - 返回一个新的节流函数*/
function throttle(fn, interval) {let lastExecTime = 0; // 上次执行时间戳return function(...args) {const now = Date.now(); // 当前时间戳// 如果当前时间与上次执行时间差大于间隔,则执行函数if (now - lastExecTime >= interval) {fn.apply(this, args); // 执行函数lastExecTime = now; // 更新上次执行时间}};
}// 使用示例
const handleScroll = throttle(function() {console.log('Scrolling...');// 实际应用:加载更多内容或更新动画
}, 100); // 每100毫秒最多执行一次window.addEventListener('scroll', handleScroll);
  • 代码解释

    • throttle 函数接收一个函数 fn 和时间间隔 interval

    • 使用 Date.now() 记录时间戳:每次事件触发,比较当前时间与上次执行时间。

    • 如果时间差超过 interval,则执行函数并更新时间戳;否则忽略。

    • 示例中,滚动事件被节流处理:每100毫秒最多触发一次,避免频繁计算。

3.应用场景

  • 页面滚动(scroll):控制滚动事件处理频率,优化无限加载或动画性能。

  • 游戏或动画控制:确保按键事件(如射击或移动)在固定帧率下执行,避免卡顿。

  • 鼠标移动事件(mousemove):在拖拽操作中,限制更新频率,提升流畅度。

  • API 请求限流:防止用户快速点击导致服务器过载。

三、防抖与节流的区别

防抖和节流都用于优化高频事件,但核心机制不同:

  • 防抖:侧重于“等待稳定状态”,只在事件停止触发后执行一次。适合处理突发性连续事件(如输入框输入),减少不必要的计算。

  • 节流:侧重于“控制执行频率”,在固定间隔内强制执行一次。适合处理持续性事件(如滚动或动画),保证流畅性。

简单对比:

特性防抖(Debounce)节流(Throttle)
核心思想多次触发,最后一次生效固定时间内只触发一次
执行时机延迟后执行(等待无新事件)立即或间隔后执行(保证频率)
适用场景搜索输入、窗口调整滚动加载、按钮点击限流
数学模型函数执行延迟到事件序列末端函数执行间隔 tt 毫秒

四、总结

        防抖和节流是前端性能优化的核心工具:防抖通过延迟执行减少连续触发,节流通过频率控制保证执行效率。正确应用它们能显著提升页面响应速度和用户体验。在实现时,注意使用 setTimeout 或时间戳管理计时逻辑,并结合实际场景选择策略。例如,搜索框用防抖,滚动事件用节流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93152.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93152.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93152.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索无人机图传技术:创新视野与无限可能

近年来,无人机技术的飞速发展不仅改变了航空行业的格局,还深刻影响了多个领域的日常运作。无人机图传技术作为无人机的核心技术之一,凭借其精准的图像传输能力和高效的远程操作特性,正在成为各行各业的得力助手。从空中拍摄到实时…

Comfyui进入python虚拟环境

如果你的 Python 可执行文件(python.exe)位于 C:\comfyui\.venv\Scripts,那么 .venv 本身已经是一个虚拟环境,你只需要 激活它,而无需再创建一个新的虚拟环境。如何激活这个已有的虚拟环境? 1. 打开终端&am…

秋招春招实习百度笔试百度管培生笔试题库百度非技术岗笔试|笔试解析和攻略|题库分享

笔试介绍 百度非技术岗笔试采用的是规定时间统一笔试形式,管培生会有两场考试分别是7月底和8月中旬,其他非技术类岗位一般在8月中旬开始。 行测题必考,有些岗位考简答题,比如管培生以及产品经理等岗位。 笔试内容 笔试内容一…

低资源语言翻译:数据增强与跨语言迁移学习策略

文章目录一、低资源语言翻译的挑战1.1 数据稀缺性1.2 语言特性复杂1.3 评估困难二、数据增强策略(Data Augmentation)2.1 基于单语数据的增强2.2 基于平行数据的增强2.3 多模态数据增强三、跨语言迁移学习策略(Cross-Lingual Transfer Learni…

【每天一个知识点】时间序列聚类

一、什么是时间序列聚类?如果把数据比作一本书,那么时间序列(Time Series)就是一本按时间顺序记录事件的日记。它可能是股票每天的价格波动、某台机器的温度曲线、一个城市的空气质量变化,甚至是人的心电信号。时间序列…

对抗损失(GAN)【生成器+判断器】

这个是啥呢,搞图片生成用的。我搜了下,把整体流程记录下,过程中会用到GAN准备数据集(真实图像素材) 目标生成人脸的,你像游戏注册时选一个脸。捏脸。那么准备真实人脸图片老规矩,缩放裁剪…

5分钟入门C++

这是5分钟入门 C 的精简 Demo&#xff0c;尽量涵盖核心概念&#xff1a;变量、函数、类、控制流、STL 容器&#xff0c;让你快速理解 C 的基本用法。#include <iostream> // 输入输出 #include <vector> // 动态数组 #include <algorithm> // 常用算法…

java注释功能

为了优化代码的使用&#xff0c;分享记录相关注释功能。 单行注释 // 这是单行注释文字多行注释 /* 这是多行注释文字 这是多行注释文字 注意&#xff1a;多行注释不能嵌套使用。 */文档注释 /**- 这是文档注释文字- */注释的作用 描述类或方法的功能&#xff0c;方便别人和自…

(论文速读)DiffusionDet - 扩散模型在目标检测中的开创性应用

论文题目&#xff1a;DiffusionDet: Diffusion Model for Object Detection&#xff08;DiffusionDet:物体检测的扩散模型&#xff09;会议&#xff1a;ICCV2023摘要&#xff1a;我们提出了DiffusionDet&#xff0c;这是一个新的框架&#xff0c;它将物体检测描述为从噪声盒到目…

LangChain简介

LangChain 是一个用于构建基于大语言模型&#xff08;LLM&#xff09;的应用程序的开源框架&#xff0c;它提供了一套工具、组件和接口&#xff0c; 可以将 LLM 模型、向量数据库、交互层 Prompt、外部知识、外部工具整合到一起&#xff0c;进而可以自由构建 LLM 应用。 LangCh…

为什么哈希表(字典)的查询速度有时会突然变慢

哈希表&#xff08;在许多语言中被称为“字典”或“关联数组”&#xff09;的查询速度&#xff0c;在理想情况下&#xff0c;应是接近“瞬时”的常数时间&#xff0c;然而&#xff0c;在特定场景下&#xff0c;其性能之所以会突然、无征兆地变慢&#xff0c;其根源&#xff0c;…

whisper 语种检测学习笔记

目录 transformers推理&#xff1a; transformers 源代码 网上的语种检测调用例子&#xff1a; 语种检测 api transformers推理&#xff1a; https://github.com/openai/whisper/blob/c0d2f624c09dc18e709e37c2ad90c039a4eb72a2/whisper/decoding.py waveform, sample_rat…

第1节 从函数到神经网络:AI思路的逆袭之路

&#x1f914; 开篇灵魂拷问 是不是觉得AI知识体系庞大到吓人&#xff1f;看了一堆快餐视频还是云里雾里&#xff1f;别慌&#xff01;这个系列就是要帮你打通任督二脉&#xff0c;用"既快又慢、既深入又肤浅、既有趣又严肃"的方式讲透AI基础知识&#xff01; &…

【科研绘图系列】R语言绘制多种饼图

文章目录 介绍 加载R包 数据下载 导入数据 数据预处理 画图1 画图2 画图3 画图4 画图5 画图6 系统信息 参考 介绍 【科研绘图系列】R语言绘制多种饼图 加载R包 rm(list = ls()) library(ggstatsplot) library(ggplot2) library(plotrix) library(ggpubr

vue3权限树封装成组件

vue3权限树组件 功能&#xff1a; 1、勾选节点、自动把父节点勾选。 2、取消勾选、子节点全部取消勾选。检查父节点&#xff0c;如果只有这个子节点、遍历把父节点取消勾选 3、filter过滤不仅展示父节点、相关子节点同时展示 4、 高亮显示所有过滤数据 效果图父组件引用 <te…

铨林接纸机学习记录1

光电开关学习做保养也是检查这些东西&#xff0c;包括气路有没漏气&#xff0c;固定件松动、轨道清洁之内刀座暂停光电I23刀座行程磁性开关&#xff0c;这个是安全警戒光电&#xff0c;驱动侧发射信号&#xff0c;操作侧接收刀座暂停光电正常运行是空白的&#xff0c;当出现遮挡…

47.分布式事务理论

所有的事务都必须满足ACID的原则: 原子性:事务中的所有操作,要么全部成功,要么全部失败。 一致性:要保证数据库内部完整性约束、声明性约束。 持久性:对数据库做的一切修改将永久保存,不管是否出现故障。 隔离性:对同一资源操作的事务不能同时发生。 分布式事务的…

【软考】进度管理知识库工具-挺方便

进度管理知识库 全面解析项目管理中的进度管理核心概念、工具、技术和最佳实践&#xff0c;帮助您高效管理项目时间线 六步流程法 规划进度管理 - 制定进度管理计划 定义活动 - 识别和记录项目活动 排列活动顺序 - 确定活动间的逻辑关系 估算活动持续时间 - 估算完成单项活动所…

PDF Replacer:高效便捷的PDF文档内容替换专家

在日常工作和学习中&#xff0c;PDF文件因其格式稳定、兼容性强而被广泛使用。然而&#xff0c;PDF文件的编辑和修改往往比其他文档格式更加复杂。PDF Replacer正是为了解决这一痛点而设计的&#xff0c;它是一款方便实用的PDF文档替换工具&#xff0c;能够帮助用户快速替换PDF…

Java中MybatisPlus使用多线程多数据源失效

Java中MybatisPlus使用多线程多数据源失效 文章目录Java中MybatisPlus使用多线程多数据源失效一&#xff1a;背景二&#xff1a;解决方法三&#xff1a;其他导致DS失效的条件3.1、Transactional一&#xff1a;背景 Mybatis-Plus使用异步任务后不能找到指定设置的DS数据库&…