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.mfbz.cn/a/597122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

密码学《图解密码技术》 记录学习 第十四章

目录 十四章 14.1 本章学习的内容 14.2 什么是 SSL/TLS 14.2.1 Alice 在 Bob 书店买书 14.2.2 客户端与服务器 14.2.3 АSSL/TLS 承载HTTP 14.2.4 SSL/TLS的工作 14.2.5 SSL/TLS也可以保护其他的协议 14.2.6 密码套件 14.2.7 SSL 与 TLS 的区别 14.3 使用 SSL/TLS 进…

产业观察:电机驱动成为人形机器人的动力核心

前不久,波士顿动力发布一则“再见,液压Atlas”视频,宣告其著名的液压驱动双足人形机器人Atlas正式退役。这则视频引起全球所有Atlas粉丝的高度关注。然而紧接着,波士顿动力便又推出了全部由电机驱动的新一代Atlas机器人&#xff0…

【Git】【MacOS】Github从创建与生成SSH公钥

创建账号 这一步不过多赘述,根据自己的邮箱新创建一个账号 配置SSH公钥 本人是macOS系统,首先从终端输入 cd ~/.ssh进入.ssh目录,然后通过 ls查看有没有一个叫做id_rsa.pub的文件 本人之前生成过SSH公钥,如果没有的话,通过 ssh-keygen -t…

luci框架相关笔记

luci架构 LuCI 架构采用了MVC(Model-View-Controller)设计模式,各个目录的作用如下: model(模型): 位于 /usr/lib/lua/luci/model 下,存放了与系统配置相关的模型脚本。这些脚本负责与底层系统…

cmd输入mysql -u root -p无法启动

问题分析:cmd输入mysql -u root -p无法启动 解决方法:配置系统环境变量 1.找到mysql安装文件下的bin文件:(复制改文件地址,如下图所示) 2.电脑桌面下方直接搜索环境变量并进入,如下图 3.点击环境变量&a…

读取打包到JAR中的文件:常见问题与解决方案(文件在但是报错not find)

读取打包到JAR中的文件:常见问题与解决方案 喝淡酒的时候,宜读李清照;喝甜酒时,宜读柳永;喝烈酒则大歌东坡词。其他如辛弃疾,应饮高梁小口;读放翁,应大口喝大曲;读李后主…

Python数据清洗与可视化实践:国际旅游收入数据分析

文章目录 概要整体流程名词解释NumPyPandasMatplotlibre 技术细节数据清洗可视化 小结 概要 在本篇博客中,我们将通过一个实际的案例,演示如何使用Python进行数据清洗和可视化,以分析国际旅游收入数据。我们将使用Python中的Pandas库来进行数…

04-25 周四 FastBuild重构实践-TLS、全局捕获异常、一键配置

04-25 周四 FastBuild重构实践 时间版本修改人描述04-25V0.1宋全恒新建文档2024年5月6日14:33:16V1.0宋全恒完成文档撰写 简介 由于 04-22 周日 阿里云-瑶光上部署FastBuild过程(配置TLS、自定义辅助命令)描述了重新部署一个FastBuild实例的过程,通过阅读这个&…

线性表的概念与结构,以及顺序表和链表的简单概念

1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线…

JS hook cookie

JS hook cookie cookie 的值是V,v是动态变化的 可以看到D中生成了cookie的值n 尝试使用RPC定位到cookie。 替换内容,下断点。 将写好的RPC代码直接插入 加入代码,file.virjar.com/sekiro_web_client.js?_123 这个地址是在前端创建客户端…

开源模型应用落地-CodeQwen模型小试-小试牛刀(一)

一、前言 代码专家模型是基于人工智能的先进技术,它能够自动分析和理解大量的代码库,并从中学习常见的编码模式和最佳实践。这种模型可以提供准确而高效的代码建议,帮助开发人员在编写代码时避免常见的错误和陷阱。 通过学习代码专家模型&…

【网络知识】光猫、路由器 和 交换机 的作用和区别?

数字信号:是指自变量是离散的、因变量也是离散的信号,这种信号的自变量用整数表示,因变量用有限数字中的一个数字来表示。在计算机中,数字信号的大小常用有限位的二进制数表示。 模拟信号:模拟信号是指用连续变化的物…

学习c#第26天 面向对象基础之类与对象

1.类 1.什么是类? 俗话说,“物以类聚,人以群分”。意思是同类的东西经常聚在一起,志同道合 的人相聚成群。前者说物,后者说人。这里以物来进行举例说明[见图]: 水果超市,所有同类的水果摆放在一起&#xf…

【机器学习与实现】线性回归分析

目录 一、相关和回归的概念(一)变量间的关系(二)Pearson(皮尔逊)相关系数 二、线性回归的概念和方程(一)回归分析概述(二)线性回归方程 三、线性回归模型的损…

vivado刷题笔记46

题目: Design a 1-12 counter with the following inputs and outputs: Reset Synchronous active-high reset that forces the counter to 1 Enable Set high for the counter to run Clk Positive edge-triggered clock input Q[3:0] The output of the counter c…

场外个股期权和场内个股期权的优缺点是什么?

场外个股期权和场内个股期权的优缺点 场外个股期权是指在沪深交易所之外交易的个股期权,其本质是一种金融衍生品,允许投资者在股票交易场所外以特定价格买进或卖出证券。场内个股期权是以单只股票作为标的资产的期权合约,其内在价值是基于标…

金融业开源软件应用 管理指南

金融业开源软件应用 管理指南 1 范围 本文件提供了金融机构在应用开源软件时的全流程管理指南,对开源软件的使用和管理提供了配套 组织架构、配套管理规章制度、生命周期流程管理、风险管理、存量管理、工具化管理等方面的指导。 本文件适用于金融机构规范自身对开…

工业物联网技术在生产流程中的应用及优势与挑战——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断发展,物联网技术逐渐渗透到各个行业中,尤其是在工业领域,工业物联网的应用正在逐步重塑生产流程。本文将探讨工业物联网如何影响生产流程,并分析其带来的优势和挑战。 一、工…

Amazon Bedrock的进化:更多选择与新特性,助力生成式AI应用更快落地

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

leetcode-没有重复项的全排列-97

题目要求 思路 1.递归,如果num和n的元素个数一样就可以插入res中了,这个作为递归的结束条件 2.因为这个题是属于排列,并非组合,两者的区别是排列需要把之前插入的元素在回退会去,而组合不需要,因此会存在一…
最新文章