JavaScript中的防抖(Debounce)和节流(Throttle):作用与使用方式

目录

引言

防抖(Debounce)

作用

使用方式

节流(Throttle)

作用

使用方式

总结

引言

        在前端开发中,我们经常会遇到需要处理高频触发的事件,如窗口大小调整、输入框内容变化、滚动事件等。这些事件在用户与页面交互时非常频繁地发生,如果直接对它们进行响应,可能会导致浏览器性能下降,用户体验变差。为了解决这个问题,我们可以使用防抖(Debounce)和节流(Throttle)这两种技术来优化事件处理。

防抖(Debounce)

        作用

        防抖技术主要是用来限制某个函数在一定时间内只执行一次。例如,在输入框内容变化时,我们希望用户停止输入一段时间后才进行搜索请求,而不是每输入一个字符就发送一次请求。这时,我们就可以使用防抖技术来实现。

        用通俗的话来说,就是“等一等再执行”。想象一下你正在填写一个搜索输入框,每输入一个字符,都会触发一个搜索请求。但是,这样会很低效,因为用户可能在连续输入多个字符后才完成他们的查询。防抖就是让你“等一等”,在用户停止输入一段时间后(比如半秒或一秒),再发送搜索请求。

        使用方式

        防抖函数通常接受一个需要被防抖的函数作为参数,并返回一个新的函数。这个新的函数会在最后一次调用后的指定时间间隔后执行原函数。如果在这个时间间隔内再次调用新的函数,那么原函数的执行会被取消,并重新计算时间间隔。

代码示例:

function debounce(func, wait) {  let timeout;  return function() {  const context = this;  const args = arguments;  // 清除之前的定时器  clearTimeout(timeout);  // 设置新的定时器  timeout = setTimeout(() => func.apply(context, args), wait);  };  
}

使用实例:

// 假设这是我们要防抖的函数,它模拟发送请求到服务器  
function sendRequest() {  console.log('Sending request...');  // 这里可以是发送网络请求的代码  
}  // 使用debounce函数创建一个新的函数  
const debouncedSendRequest = debounce(sendRequest, 500); // 设置500毫秒的等待时间  // 假设我们有一个按钮  
const button = document.querySelector('button');  // 给按钮添加点击事件监听器  
button.addEventListener('click', debouncedSendRequest);  // 现在,如果你快速点击按钮多次,它只会在最后一次点击后的500毫秒内发送一次请求  
// 而不是每次点击都发送请求

节流(Throttle)

作用

        节流技术主要是用来限制某个函数在一定时间内执行的次数。与防抖不同的是,节流保证在一段时间内函数至少会执行一次。例如,在滚动事件中,我们希望每隔一段时间才触发一次滚动处理函数,而不是每次滚动都触发。

        通俗的话来说,就是“别执行得太频繁了”。还是以搜索输入框为例,如果你设置了一个节流函数,那么不管用户输入得有多快,搜索请求都只会每隔一段时间(比如半秒)发送一次。

使用方式

        节流函数同样接受一个需要被节流的函数作为参数,并返回一个新的函数。这个新的函数会在每次调用时检查距离上次执行的时间间隔,如果超过了指定的时间间隔,则执行原函数,并更新上次执行的时间。

代码示例:

function throttle(func, limit) {  let inThrottle;  return function() {  const context = this;  const args = arguments;  if (!inThrottle) {  func.apply(context, args);  inThrottle = true;  setTimeout(() => inThrottle = false, limit);  }  };  
}

使用实例:

// 假设这是我们要节流的函数,它模拟了某个耗时的操作  
function expensiveOperation() {  console.log('Expensive operation is running...');  // 这里可以是耗时的代码,比如网络请求、DOM操作等  
}  // 使用节流函数创建一个新的函数  
const throttledOperation = throttle(expensiveOperation, 2000); // 设置2秒的时间间隔  // 假设我们有一个按钮  
const button = document.querySelector('button');  // 给按钮添加点击事件监听器  
button.addEventListener('click', throttledOperation);  // 现在,无论你如何快速地点击按钮,expensiveOperation函数最多每2秒执行一次

        在这个例子中,throttle 函数接受一个要节流的函数 func 和一个时间间隔 limit(以毫秒为单位)。它返回一个新的函数,这个新函数在被调用时会检查 inThrottle 变量。如果 inThrottle 为 false(表示当前不在节流期间),则执行原始函数 func,并将 inThrottle 设置为 true,同时启动一个定时器,在 limit 毫秒后将 inThrottle 设置为 false。如果 inThrottle 为 true(表示当前在节流期间),则不执行任何操作。

总结

        防抖和节流是优化高频触发事件处理的两种常用技术。防抖侧重于限制函数在一定时间内只执行一次,而节流则侧重于限制函数在一定时间内执行的次数。在实际开发中,我们可以根据具体需求选择合适的技术来优化性能。

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

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

相关文章

pthread线程相关

LWP :轻量级 进程,本质仍是进程 进程 :独立地址空间,拥有PCB 线程:有独立的TCB,但没有独立的地址空间(共享) 区别 :在与是否共享地址文件 进程 (独居)&am…

数据结构:最小生成树(Prim算法和Kruskal算法)、图的最短路径(Dijkstra算法和Bellman-Ford算法)

什么是最小生成树?Prim算法和Kruskal算法是如何找到最小生成树的? 最小生成树是指在一个连通图中,通过连接所有节点并使得总权重最小的子图。 Prim算法和Kruskal算法是两种常用的算法,用于寻找最小生成树。 Prim算法的步骤如下&…

文件API及其操作

这里介绍两类文件操作、三个文件类。包括文件系统操作(File类)、文件内容操作(操作字节流、操作字符流) 1.文件类File 1.1.认识File类 (1)什么是File类呢?其实就是可以操作文件的一个类。通过…

C# dateTimePicker控件存取数据库问题

存入数据库时,先设置, dateTimePicker1.Format DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat "yyyy-MM-dd HH:mm:ss"; 然后,dateTimePicker1.Text 就和textBox1.Text一样方式存入数据库;…

结构化开发中耦合和内聚的类型

一、耦合 1、无直接耦合。指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。因此,模块间耦合性最弱,模块独立性最高。 2、数据耦合。指两个模块之间有调用关系,传递的是简单…

【Java EE】Mybatis之XML详解

文章目录 🎍配置数据库连接和MyBatis🍀写持久层代码🌸添加mapper接口🌸添加UserInfoXMLMapper.xml🌸单元测试 🌲CRUD🌸增(Insert)🌸删(Delete)🌸改(Update)🌸…

低空经济+飞行汽车:eVTOL技术详解

低空经济是以各种有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引,辐射带动相关领域融合发展的综合性经济形态。它广泛体现于第一、第二、第三产业之中,在促进经济发展、加强社会保障、服务国防事业等方面发挥着日益重要的作用。 飞行汽车&#xff0c…

Linux服务器常用命令总结

view查找日志关键词 注意日志级别,回车后等一会儿,因为文件可能比较大加载完需要时间 当内容显示出来后,使用“/关键词”搜索 回车就能搜到,n表示查找下一个,N表示查找上一个 find 查找 find Family -name book …

js APIS part2

什么是事件? 事件是在编程时系统内发生的 动作 或者发生的事情。比如用户在网页上 单击 一个按钮 什么是事件监听? 就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 绑定事件或者注册…

Python爬取豆瓣电影Top250数据

任务 爬取豆瓣电影top250中的影片名称、影片海报、年份、地区、类型、评分、评价人数、总体评价,并输出到douban_top250.xlsx文件中 环境 Python 3.8 requests bs4 openpyxl 源码 # 创建一个新的Excel工作簿 workbook openpyxl.Workbook() # 获取默认的工作表…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新,以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理,仅供学习参考。 PPT可编辑(完整资料包含以下内容) 目录 精酿啤酒品牌私域执行运营的内容策划,涉及以下几个…

Messari 报告摘要 :Covalent Network(CQT)2024 年第一季度表现

摘要: 尽管 CQT 代币流通供应量增加了 20%(新增 1.04 亿枚 CQT),但 CQT 的质押百分比仅从 2023 年第一季度的 22% 增长到了 2024 年第一季度的 29%。 CQT 的市值季度环比增长了 28%,多次达到 2.75 亿美元&#xff0c…

全栈开发之路——前端篇(4)watch监视、数据绑定和计算属性

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 辅助文档:HTML标签大全(实时更新&#xff…

zabbix 入门教程

Zabbix是一个开源的监控系统,它可以用来监控网络、服务器、虚拟机和云资源等。以下是从入门到掌握Zabbix的一些基本步骤: 1. 安装Zabbix 首先,你需要在你的服务器上安装Zabbix。Zabbix支持多种操作系统,包括Linux、Windows和mac…

react使用谷歌人机验证

在项目中,需要对请求验证,防止被爆破,这里使用的是谷歌的recaptcha-v3。 1.申请谷歌人机验证的api 申请链接,申请完后需要将两个谷歌颁发的key分别写入前,后端的配置环境中,后面会使用. 2.前端部分 前端使用的是viteC…

Python | Leetcode Python题解之第64题最小路径和

题目: 题解: class Solution:def minPathSum(self, grid: List[List[int]]) -> int:if not grid or not grid[0]:return 0rows, columns len(grid), len(grid[0])dp [[0] * columns for _ in range(rows)]dp[0][0] grid[0][0]for i in range(1, r…

All In ai,Oracle 23C没了,等来了Oracle 23ai

今年一月份的Blog介绍Oracle命名规则的时候,说到Oracle的命名是紧紧跟随时代浪潮的前言科技的,在文章的最后还大胆预测也许Oracle的下一个版本就叫25A了,结果Oracle根本等不及,把原来已经海量宣传的Oracle 23C直接改名为23ai&…

分布式与一致性协议之Raft算法(四)

Raft算法 Raft是如何解决成员变更问题的 在日常工作中,你可能会遇到服务器故障的情况,这时你需要替换集群中的服务器。如果遇到需要改变数据副本数的情况,则需要增加或移除集群中的服务器。总的来说,在日常工作中,集…

如何基于nginx搭建https网站

华子目录 使用nginx的http_ssl模块建立加密传输的网站查看配置文件ssl配置文件的主要参数实验:搭建nginxssl加密认证的web服务器 使用nginx的http_ssl模块建立加密传输的网站 查看 [rootserver ~]# nginx -V #查看是否有--with-http_ssl_module模块,如…

AI时代,如何让ChatGPT成为你最好的编程老师|TodayAI

ChatGPT作为生成式预训练变换器(GPT)系列模型的一种,专门设计用来理解和生成文本,其生成的文本能够高度模仿人类的对话方式。这种能力不仅让它在进行日常对话时表现得像极了真人,还使其在各种专业领域内,比…