前端开发:JS的节流与防抖

news/2024/4/19 16:44:06/文章来源:https://blog.csdn.net/CC1991_/article/details/129243201

前言

在前端实际开发中,有关JS原生的节流和防抖处理也是很重要的点,关于底层和原理的掌握使用,尤其是在性能优化方面甚为重要。作为前端开发的进阶内容,在实际开发过程中节流和防抖通常都是项目优化的必要手段,而且也是非常常用的优化手段,因为在前端程序中防止用户短时间内快而高频地多次操作触发动作执行,最常用的就是页面提交按钮,为了防止用户多次点击重复提交触发表单多次提交的问题,还有就是为了防止用户在拖动滑动条的时候,多次触发加载更多等情况。所以在JS中节流与防抖的使用也是比较常用的知识点,而且在前端求职面试的时候二者也是必考知识点,可以说非常重要,那么本文就来做一下总结,方便查阅使用。

闭包

由于在JS中的节流与防抖都是属于闭包的应用范畴,所以想要理解防抖和节流,首先要理解闭包。

闭包:一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

通俗的说,闭包就是能够读取其他函数内部变量的函数。由于在 JavasSript 语言中,只有函数内部的子函数才能读取局部变量,所以闭包可以简单理解成"定义在一个函数内部的函数"。在本质上看,闭包是将函数内部和函数外部连接起来的桥梁。 想要了解闭包的详细内容可以阅读三掌柜的这篇文章:前端开发:JS中闭包的使用详解前端开发:JS中闭包的使用详解_js闭包的使用_三掌柜666的博客-CSDN博客

JS节流与防抖

在前端开发过程中,为了提高应用程序性能,在用户进行窗口操作和输入框操作时候多次提交或者滑动的时候,如果未对事件处理函数调用频率做限制的时候,会增加浏览器和服务器的负担,造成用户体验感非常差,甚至有些滑动事件由于自身复杂的计算回调函数频繁调用会引起前端页面的卡顿。还有就是在绑定scroll、resize事件时,当它发生的时候被触发的频率非常高、间隔很近,尤其是日常开发的页面中,事件中涉及到大量的位置计算、DOM操作、元素重绘等等,这些都无法在下一个scroll事件出发前完成,就会引起浏览器的卡帧,严重影响用户体验感。

针对这些问题,提高用户体验,优化程序性能,就可以采用节流和防抖的方式来解决这些问题,把多次计算汇合成一次计算,只操作一个精确点即可,这样可以减少事件函数的调用频率,减轻了浏览器负担,提高了程序性能,提高了用户体验。

另外,防抖动和节流本质是不一样的。防抖是多次触发但最后只会执行一次,节流是多次触发但周期内只会执行一次。函数节流与函数防抖都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。接下来就来详细解答二者具体的区别。

 

节流是什么?

节流(throttle):当持续触发事件时候,保证一定时间段内只调用一次事件处理函数,也就是持续触发事件,每隔一段时间只执行一次函数。节流的策略是,在每个时间周期内,不论触发多少次事件,只执行一次动作。在上一个时间周期结束后,如果又有事件触发,则开始新的时间周期,同理,在新的时间周期里只执行一次动作。 和防抖类似,节流策略也分前缘和延迟两种。延迟是指周期结束后执行动作,前缘是指执行动作后再开始周期。

节流使用场景:有很多,比如图片懒加载的使用、进行ajax数据请求加载的使用、下滑自动加载数据、侧边浮动导航栏等等。

函数节流:指在一定时间周期内执行的操作只执行一次,也就是预先设定一个执行周期,当调用动作的时间大于等于执行的周期则执行该动作,接着进入下一个新周期。一个函数执行一次后,只有大于设定的执行周期后才会执行第二次。

节流函数的实现

节流函数的适用场景主要在拖拽场景和缩放场景中,如固定时间内只执⾏⼀次,防⽌超⾼频次触发位置变动;以及监控浏览器的resize等场景。具体实现示例如下所示:

const throttle = (fun, delay) => { //fun是事件处理程序,delay是事件执行的延迟事件,单位为毫秒let timer = null;return (...args) => {clearTimeout(timer); //每次触发事件,需要把定时器清理之后重新计时timer = setTimeout(() => {fun.apply(this, args); //执行事件处理程序timer = null; //事件执行之后把清除定时器,待下次触发事件的时候重新设置}, delay);};};

防抖是什么?

防抖(debounce):在持续触发事件的时候,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。防抖一定是在事件触发N秒后才会执行,若在一个事件触发的N秒内又触发了该事件,以新的事件时间为准,N秒过后才执行,等触发事件N秒内不再触发事件才执行。也就是多次快速频繁地触发事件,只会执行一次事件函数,前提是需要加上一个时间限制。也可以理解为,为了防止快速且频繁的触发事件而导致多次执行事件函数引起程序卡顿等问题,可以设置在多次触发的事件只执行一次事件函数,且需要设定一个间隔时间,若两次事件触发的间隔时间低于设定的时间,就是频繁操作。

防抖的特点是当事件快速连续不断触发时,动作只会执行一次。分为两种,一种是延迟debounce,一种是前缘debounce。 延迟debounce,是在周期结束时执行,前缘debounce,是在周期开始时执行。但当触发有间断,且间断大于我们设定的间隔时间时,动作就会有多次执行。

防抖使用场景:有很多,比如监听滚动事件、鼠标移动事件onmousemove、频繁点击表单提交按钮等。

函数防抖:是指在一定时间内,在动作被连续频繁触发的情况下,动作只会被执行一次,也就是当调用动作过N秒后,才会执行该动作,若在这N秒内又调用该动作则将重新计算执行时间,所以短时间内的连续动作只会触发一次。

防抖函数的实现

防抖函数的适用场景主要在防止多次提交场景,比如防⽌多次提交按钮,只执⾏最后提交的⼀次;输入框输入的时候,只执⾏⼀段连续的输⼊事件的最后⼀次;以及搜索框进行搜索联想词功能。具体实现示例如下所示:

const debounce = (fun, delay) => { //fun是事件处理程序,delay是事件执行的延迟事件,单位为毫秒let timer = null;return (...args) => {clearTimeout(timer); //每次触发事件,需要把定时器清理之后重新计时timer = setTimeout(() => {fun.apply(this, args); //执行事件处理程序}, delay);};};

防抖与节流注意事项

在使用节流和防抖的时候,要注意以下的点:

①闭包的运用

实际中要避免全局的命名污染,所以不建议使用全局变量,同时为了让所需要的变量能够得到缓存,所以使用闭包存储部分需要用到的变量。

②this指向以及event参数

由于在事件触发调用的时候,是由防抖或者节流函数return返回出来的函数,而不是事件函数,事件函数是作为参数传入防抖或者节流函数中的,所以它的this指向是window,而不是触发事件调用函数的dom。同理可知,事件自带的event参数也是拿不到的,所以需要通过闭包去存储this上下文以及argument这个传递给函数的参数的类数组对象。事实上,所有的高阶函数内部都需要特别注意this的绑定 。

节流与防抖的总结

防抖:其实就是维护一个定时器,把多个相同的操作合并成一个操作,规定在delay后触发函数,若在此之前触发函数,则取消之前的计时重新计时,只有最后一次操作才能被触发。

节流:原理就是判断是否达到一定的时间周期来触发事件,规定某个时间段内只能触发一次函数。

节流与防抖区别:防抖只会在最后一次事件后执行触发函数;节流不管操作事件多么的频繁都会保证在规定时间段内触发事件函数。

最后

通过本文关于前端开发JS中的节流与防抖的详细介绍,不管是在实际的前端开发工作中还是在前端求职面试中都是非常关键的知识点,所以作为前端开发者来说必须要掌握它相关的内容,尤其是从事前端开发不久的开发者来说尤为重要,是一篇值得阅读的文章,重要性就不在赘述。欢迎关注,一起交流,共同进步。

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

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

相关文章

机器学习笔记之近似推断(二)推断的核心思想

机器学习笔记之近似推断——推断的核心思想引言回顾:推断的目的与困难推断的目的推断的困难推断的核心思想——优化引言 上一节介绍了从深度学习的角度介绍了推断,并介绍了推断的目的和困难。本节将继续介绍推断的核心思想。 回顾:推断的目…

写给交互设计新手的信息架构全方位指南

目录什么是信息架构?通用方法日常工作可以关注的大神常用工具相关书籍什么是信息架构?信息架构是一个比众多其他领域更难定义的领域。内容策划由内容策划师来完成,交互设计由设计师来完成,而信息架构的完成与它们不同,…

达梦数据库(DM8)集成使用 Geotools(27.2)

达梦数据库(DM8)集成使用 Geotools(27.2)系统环境版本达梦 8 集成 Geotools 环境安装达梦8,请参照项目 pom.xml 添加 geotools 配置项目 pom.xml 添加达梦数据库驱动包Geotools 使用示例Geotools 连接数据库Geotools 空…

CLion Remote Debug CrossCompile

CLion远程Docker调试ROS(交叉编译)的设置步骤 准备一个好用的docker,运行起来(Docker Image一定可以跑cuda和图形界面的,否则启动不了CLion,可以不用浪费时间看本教程了) 在docker镜像中配置好ssh和rsync,…

测量 R 代码运行时间的 5 种方法

简介 平常在撰写论文时,会需要比较算法之间的计算时间。本篇文章给出几种测量 R 代码运行时间的方法。本文是小编学习过程中的笔记,主要参考博客1,2。 1. 使用 Sys.time() 小编通常使用 Sys.time() 函数来计算时间。首先记录当前运行时刻&…

数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)

目录赫夫曼树概述定义构造赫夫曼树步骤代码实现赫夫曼树概述 HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树、霍夫曼树、哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点…

如何在logback.xml中自定义动态属性

原文地址:http://blog.jboost.cn/trick-logback-prop.html 当使用logback来记录Web应用的日志时,我们通过在logback.xml中配置appender来指定日志输出格式及输出文件路径,这在一台主机或一个文件系统上部署单个实例没有问题,但是…

超店有数分享:2023还有哪些tiktok数据值得关注?

目前,tiktok是全球增长最迅猛的社交媒体软件之一。很多商家瞄准了tiktok的变现转化潜力,纷纷入局tiktok电商赛道。在入局这个赛道之前,我们需要了解一些tiktok的相关数据,这样才能更好的了解大局,及时调整自己的业务情…

Python 简单可变、复杂可变、简单不可变、复杂不可变类型的copy、deepcopy的行为

copy模块:copy:浅拷贝deepcopy:深拷贝简单可变类型、复杂可变的copy()、deepcopy():简单不可变、复杂不可变类型的copy()、deepcopy():结论:对于简单类型的可变类型copy是深拷贝,改变了该拷贝变…

TIA博途Wincc中自定义配方画面的具体方法示例

TIA博途Wincc中自定义配方画面的具体方法示例 前面和大家分享了通过TIA博途自带的配方视图组态配方功能的具体方法,具体内容可参考以下链接中的内容: TIA PORTAL wincc中配方recipe组态及配方视图的使用方法 但是,使用配方视图的时候感觉不是很方便,同时一部分使用人员也感…

机房运维6大隐患,你中了几个?

随着医院的看诊预约、缴费、打印报告等众多业务转至线上进行,对医院的网络及数据处理能力提出越来越高的要求,那么,机房的稳定、安全运行是医院网络信息系统的关键因素。 机房运维6大隐患 01.电源电力系统不稳定,网络设备运转遭到…

C/C++语法练习之顺序结构篇

名人说: 如果你问一个善于溜冰的人怎样获得成功时, 他会告诉你:“跌倒了,爬起来”,这就是成功。——牛顿 专栏:牛客刷题 顺序结构篇〇、知识引入一、内容1004-学姐的“Helloworld”1005-乘法表1019-hellowo…

TCP粘包|拆包和解决方案

1 产生原因TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化算法&…

【算法题】最大矩形面积,单调栈解法

力扣:84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 题意很简单,翻译一下就是:求该图中…

预训练BERT

与PTB数据集相比,WikiText-2数据集保留了原来的标点符号、大小写和数字,并且比PTB数据集大了两倍多。 我们可以任意访问从WikiText-2语料库中的一对句子生成的预训练(遮蔽语言模型和下一句预测)样本。 原始的BERT有两个版本&…

BI的作用,体现在企业的哪些方面

对市场异常敏感的商业世界自然不会放过获取数字经济的机会,以国企和央企为首的众多企业开始进行数字化转型,通过信息化建设,部署商业智能BI来完成转型工作。 为什么会出现BI 有一点可能出乎很多人意料,虽然 BI 是因为信息化、数…

智能家居项目(六)之摄像头模块

目录 一、树莓派mipg-streamer实现监控功能调试 1、实现基本思路 2、安装摄像头模块 2.1、在安装sudo apt-get install libv4l-dev 的命令时报错 3、开启摄像头 以下内容是针对树莓派是stretch版本的修改办法: 一、树莓派mipg-streamer实现监控功能调试 1、…

spring boot maven打包jar包太大,怎么办?这个方法解决你的烦恼

在springboot maven项目中,有两种打包方式,一种是war包,一种是jar,今天我们讲一下jar的打包方式。但是在jar包打包只要我们发现,我们的项目jar太大了,每次上传到服务器的时候非常的慢,接下来我们…

大数据处理各组件概念及作用

一、数据采集: 1.1 Flume集群:数据采集工具,如写脚本将不同源端的数据采集后进行数据存储,或推送至Kafka等; 1.2 FTP集群:文件传输工具; 1.3 Kafka集群:消息队列,未避免…

高压放大器在应力波法套筒灌浆密实度检测研究中的应用

实验名称:高压放大器在应力波法套筒灌浆密实度检测研究中的应用研究方向:无损检测测试目的:钢筋套筒灌浆连接技术被广泛应用于装配式建筑节点连接中,但灌浆不密实将导致节点失效的风险。因此,施工中对套筒灌浆的密实度…