【JS】节流与防抖技术

JavaScript: 节流与防抖技术

当用户进行滚动、调整窗口大小或进行频繁的键盘输入时,页面上的某些事件处理器可能会被频繁触发。如果每次事件触发都执行函数,可能会对性能产生显著影响。在这种情况下,我们可以利用节流(Throttle)和防抖(Debounce)技术来优化性能。

节流(Throttle)

节流是一种限制函数执行频率的技术。使用节流时,函数在一个固定的时间间隔内只被允许执行一次。即使在这个时间间隔内事件被多次触发,函数也只会执行一次。

这种技术特别适用于处理如滚动事件和窗口大小调整这样的事件,因为它们可能会在短时间内被频繁触发。

实现节流函数

下面是一个如何实现节流函数的示例:

function throttle(func, limit) {let lastFunc;let lastRan;return function() {const context = this;const args = arguments;if (!lastRan) {func.apply(context, args);lastRan = Date.now();} else {clearTimeout(lastFunc);lastFunc = setTimeout(function() {if ((Date.now() - lastRan) >= limit) {func.apply(context, args);lastRan = Date.now();}}, limit - (Date.now() - lastRan));}}
}

你可以这样使用它:

window.addEventListener('resize', throttle(function() {console.log('Resize event handler called every 1000ms');
}, 1000));

防抖(Debounce)

与节流相比,防抖技术延迟函数的执行直到事件停止触发后一段时间。如果在等待时间内事件再次被触发,则延时将重新开始。

这种技术适用于那些我们只关心事件触发后结果而不关心过程的情况,例如搜索框输入。

实现防抖函数

以下是实现防抖函数的示例:

function debounce(func, delay) {let inDebounce;return function() {const context = this;const args = arguments;clearTimeout(inDebounce);inDebounce = setTimeout(() => func.apply(context, args), delay);}
}

使用方法如下:

const input = document.getElementById('input');
input.addEventListener('keyup', debounce(function() {console.log('Input value:', this.value);
}, 300));

选择正确的技术

节流和防抖都是优化高频事件触发情况下函数执行的有效手段。使用节流时,函数在固定时间内只执行一次,适合频繁发生的事件。而使用防抖时,函数只在最后一次事件触发一段时间后执行,适合对结果敏感的场景。

选择节流还是防抖,取决于你的具体需求。如果你需要在事件频繁发生时减少函数的执行频率,那么节流是一个好选择。如果你需要确保函数只在事件触发结束后执行,那么防抖可能更适合。

结论

了解和应用节流与防抖技术,可以帮助我们提升页面性能,提高用户体验。在开发过程中合理地使用它们,可以避免不必要的函数执行,从而节省计算资源并减轻页面负担。

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

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

相关文章

JS - 以工厂模式和原型模式方式建造对象、JS的垃级回收机制、数组的使用

创建对象的方式 使用工厂方法来建造对象 在JS中我们可以通过以下方式进行创建对象: var obj {name:"孙悟空",age:18,gender:"男",sayName:function(){alert(this.name);}};var obj2 {name:"猪八戒",age:28,gender:"男",…

Glide添加token和userId

方法一&#xff1a; GlideUrl glideUrl new GlideUrl(url, new LazyHeaders.Builder().addHeader("userId", userId).addHeader("token", token).build());FutureTarget<File> target Glide.with(context).asFile().load(glideUrl).submit(); 方法…

【Java EE】总结12种锁策略以及synchronized的实现原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

基于yolov5实时实例分割

是一个结合了最新技术进展&#xff08;State-of-the-Art, SOTA&#xff09;的实时实例分割项目&#xff0c;基于著名的YOLOv5目标检测架构&#xff0c;并对其进行扩展以实现对图像中每个对象实例的精确像素级分割。以下是该项目的中文介绍&#xff1a; YOLOv5&#xff1a; YOL…

精选20个大模型高频面试题

我精选20个大模型高频面试题&#xff0c;分享给大家 简述GPT和BERT的区别讲一下GPT系列模型是如何演进的&#xff1f;为什么现在的大模型大多是decoder-only的架构&#xff1f;讲一下生成式语言模型的工作机理哪些因素会导致LLM的偏见&#xff1f;LLM中的因果语言建模与掩码语…

代码随想录算法训练营第五十五天|392.判断子序列、115.不同的子序列

动态规划 文章目录 一、判断子序列二、不同的子序列总结 一、判断子序列 和之前的公共子序列相同&#xff0c;增加一个判断序列长度是否等于字串长度的操作即可 class Solution { public:bool isSubsequence(string s, string t) {//保持相对位置vector<vector<int>…

Java后端利用百度地图全球逆地理编码,获取地址

声明&#xff1a;本人是在实习项目的时候遇到的问题 一.使用Api分为四步骤全球逆地理编码 rgc 反geo检索 | 百度地图API SDK 步骤1,2自行完成 接下来去获取AK 二.申请AK 登录百度账号 点击创建应用&#xff0c;选择自己想用的服务&#xff0c;我只单选了逆地理编码&#xff…

【ARMv9 DSU-120 系列 9.2 -- Cluster 和 Cores CTI 详细介绍】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 DebugBlock subcomponentsARM DSU_120 CTI外部 interfaceCTI input triggers from each PECTI output triggers from each PEAllocation of cluster CTI trigger inputsAllocation of cluster CTI trigger outputsDebu…

2024年创业意识培训考试题库及答案

一、选择题 11.不属于你企业优势的是&#xff08;&#xff09;。 A.产品同质化 B.产品差异化 C.产品品牌化 D.产品个性化 答案&#xff1a;A 12.一个人的工作经验、&#xff08;&#xff09;、企业实践经验、爱好、社会交往和家庭背景等对于企业成功都是很重要的因素。 …

go语言实现简单认证样例

目录 1、代码实现样例 2、postman调用 1、代码实现样例 package mainimport ("net/http""strings""github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin" )var (// 密钥&#xff0c;用于验证 JWT 令牌signingKey []byte("…

golang变量常见问题总结

文章目录 1. 值类型和引用类型都有哪些2. 值类型和引用类型的区别3. 变量是否等于nil4. 能否进行等值比较5. 能否不分配内存直接添加元素 1. 值类型和引用类型都有哪些 值类型&#xff1a;int&#xff0c;string&#xff0c;bool&#xff0c;float&#xff0c;数组&#xff0c…

K8s: Prometheus 监控主机 和 K8s 集群

Prometheus 监控主机 和 K8s 集群 1 &#xff09;搭建 Prometheus 创建对应 ServiceAccount 达成角色访问的目的&#xff0c;避免所有人都能看到 创建配置相关的 configmap 定义了一堆的任务&#xff0c;收集各个层面的监控数据 创建告警规则相关的configmap 比如内存大于 75%…

【1762】java校园单车投放系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java校园单车投放管理系统是一套完善的java web信息管理系统 采用serlvetdaobean&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#…

C语言基础知识笔记——万字学习记录

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要参考浙大翁恺老师的C语言讲解以及其他博主的C语言学习笔记&#xff0c;进而梳理C语言的基础知识&#xff0c;为后续系统性学习数据结构和其他语言等知识夯实一定的基础。&#xff08;其他博主学习笔记的链接包括&#x…

网络服务SSH-远程访问及控制

一.SSH远程管理 1.SSH介绍 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;最早是由芬兰的一家公司开发出来&#xff0c;并且在IETF &#xff08;Internet Engineering Task Force&#xff09;的网络草案基础上制定而成的标准协议。主要用来实现字符…

案例-部门管理-删除

黑马程序员JavaWeb开发教程 文章目录 一、查看页面原型二、查看接口文档三、开发1、Controller2、Service&#xff08;1&#xff09;service接口层&#xff08;3&#xff09;service实现层 3、Mapper4、Postman 一、查看页面原型 二、查看接口文档 三、开发 1、Controller 因…

android博客

csdn千里马 yi诺千金_Android,Android Framework从入门到入土,前端开发-CSDN博客 阿豪 Android Framework 坂田 https://djlr0d3mqe.feishu.cn/wiki/TvArwktx5iNO00k0G2WcUH9QnBf?fromtab_home#part-KmC4d5iTRoNYSUxEkKlc7O1Lnbe 阿豪 https://yuandaimaahao.gitee.io/A…

使用python写一个识别人脸

人脸识别的原理涉及多个领域&#xff0c;包括图像处理、特征提取和机器学习等。以下是一个简化的概述&#xff0c;并展示了如何使用Python和OpenCV库来实现基本的人脸识别。 人脸识别原理概述 图像预处理&#xff1a;首先&#xff0c;我们需要对输入的图像进行预处理&#xf…

短视频账号“四部定位法”,让流量噌噌上涨 沈阳短视频剪辑培训

在当下短视频的风潮中&#xff0c;企业纷纷涉足这一领域&#xff0c;希望通过短视频平台吸引用户、提升品牌知名度、促进销售转化。 然而&#xff0c;面对海量的内容和激烈的竞争&#xff0c;企业如何才能在短视频领域脱颖而出&#xff1f; 在企业涉足短视频领域之前&#xf…

用友裁应届

下半年准备来用友的24应届生们&#xff0c;请三思&#xff01;&#xff01;&#xff01; 我是23届某9研究生&#xff0c;2月份用友以绩效低为由被裁&#xff08;我一个应届生跟老员工比绩效&#xff0c;搞笑呢&#xff09;。 半年被裁&#xff0c;找工作太难了&a…