JavaScript 函数节流 throttle 和防抖 debounce

今天和别人聊到JavaScript函数的节流和防抖,发现自己对这两个的区别很是模糊,遂小小实践一下,在此记录,希望对需要的人有所帮助。

节流 - 频繁操作,间隔一定时间去做一件事

举例说明:假定时间间隔为 500ms,频繁不停的操作 2s,且每两次执行时间小于等于时间间隔 500ms,那么就会执行 4 次,也就是每隔 时间间隔 500ms 执行一次。

防抖 - 频繁操作,一定时间间隔内只执行最后一次操作

举例说明:假定时间间隔是 500ms,频繁不停的操作 5s,且每两次执行时间小于等于时间间隔 500ms,那么最后只执行了 1 次,也就是每一次执行时都结束了上一次的执行。

代码示例

    //节流方法 1function throttle1(method, duration){var prevTime = new Date();return function () {var context = this,currentTime = new Date(),resTime = currentTime - prevTime;//打印出本次调用方法和上次执行方法的时间差console.log("时间差"+resTime);//当本次调用距离上次执行方法的时间差大于等于要求时间间隔时,执行一次方法if(resTime >= duration){method.apply(context);//记录执行方法的时间prevTime = currentTime;}}}//节流方法 2function throttle2(method, duration){//当前时间间隔内是否有方法在执行(或者说方法的调用是否在进行)var runningFlag = false;return function (e) {// 判断当前是否有方法在执行,有,则什么都不做if (runningFlag) {return false;}//开始执行runningFlag = true;setTimeout(function(){method(e);//执行完毕,声明当前没有正在执行的方法,方便下一个时间间隔内的调用runningFlag = false;}, duration)}}//防抖function debounce(method, duration){var timer = null;return function(){var context = this,args = arguments;//在本次调用之前的一个间隔时间内,有方法在执行,则终止该方法的执行if(timer){clearTimeout(timer);}//开始执行本次调用timer = setTimeout(function(){method.apply(context, args);},duration);}}//模拟三个执行方法function jieliu1(){console.log("节流 1");}function jieliu2(){console.log("节流 2");}function fangdou(){console.log("防抖");}//持续执行时间var totalTime = 2000;var jieliuFn1 = throttle1(jieliu1,500);var jieliuFn2 = throttle2(jieliu2,500);var fangdouFn = debounce(fangdou,500);(function(duration){setInterval(function(){if( totalTime > 0 ){jieliuFn1();jieliuFn2();fangdouFn();totalTime -= duration;}},duration);})(100);

运行结果

时间差 100
时间差 201
时间差 303
时间差 401
时间差 504
节流 1
时间差 98
节流 2
时间差 199
时间差 300
时间差 396
时间差 496
时间差 597
节流 1
时间差 100
节流 2
时间差 203
时间差 299
时间差 402
时间差 500
节流 1
时间差 103
时间差 204
节流 2
时间差 303
时间差 400
节流 2
防抖

结论

由以上运行结果可以看出,节流1 出现了 3 次,节流2 出现了 4 次,防抖出现了 1 次。防抖实现顺利,但是两个节流方法的执行结果存在差异。
观察时间差可以看出,每次节流1 执行时,时间差并不会都是 500 整,也就是说,一共调用 2 秒时,节流1 并不能做到每隔 500 毫秒执行一次而共执行 4 次,第四次执行往往因为前面的 3 次执行的时间误差,而导致到达时间 2 秒时,最后一次的时间差无法达到 时间间隔 500ms 以上,以至于只能执行 3 次。

结论:当在一个大范围的时间内,比如两小时内,每几分钟执行一次,超过2小时则不再实行,推荐使用第一种节流方式,;如果仅仅要求间隔一定时间执行一次,推荐使用第二种节流方法;防止频繁操作,比如表单多次提交,推荐使用防抖。

如有问题,欢迎指正,谢谢!

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

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

相关文章

python 第三方绘图库_D3py首页、文档和下载 - 基于 D3 的 Python 绘图库 - OSCHINA - 中文开源技术交流社区...

D3py 是一个基于 D3 的 Python 绘图库,可以像 D3 那样画出可交互的漂亮图形。D3py 的目的是把来自命令行或者脚本的数据画到浏览器窗口,d3py 通过构建两个优秀的包来实现这一点。 第一个是 d3.js(Mike Bostock),它是一个用于创建数据驱动文档…

web 前端 如何分享到instagram_如何找到靠谱的Web培训机构?web前端培训机构哪个好?...

现如今Web前端开发应用越来越广泛,Web前端工程师人才需求逐年递增,薪资待遇也是水涨船高,也因此吸引了越来越多的人想要迈入Web前端行业,参加Web前端培训是很多人选择学习前端开发技能的途径,那么Web前端培训机构哪个好…

java main 命令行_java Main 命令行

CLI 即Command Line Interface,也就是"命令行接口",它为Java 程序访问和解析命令行参数提供了一种统一的接口。apache Commons CLI为用户提供了一个解释命令行的API.它在解释命令行时主要有三个状态,即:定义、解释和询问…

zookeeper命令行操作

进入命令行 运行 zkCli.sh –server <ip>进入命令行工具。 [rootzk1 bin]# zkCli.sh -server <不加ip地址&#xff0c;连接本地zookeeper> Error: no argument found for option -server Connecting to localhost:2181 [zk: localhost:2181(CONNECTED) 0] …

Spring Data JPA 实例查询

转自&#xff1a;https://www.cnblogs.com/rulian/p/6533109.html 一、相关接口方法 在继承JpaRepository接口后&#xff0c;自动拥有了按“实例”进行查询的诸多方法。这些方法主要在两个接口中定义&#xff0c;一是QueryByExampleExecutor&#xff0c;一个是JpaRepository&am…

python可变参数函数二阶导数公式_Python中函数的参数定义和可变参数

刚学用Python的时候&#xff0c;特别是看一些库的源码时&#xff0c;经常会看到func(*args, **kwargs)这样的函数定义&#xff0c;这个*和**让人有点费解。其实只要把函数参数定义搞清楚了&#xff0c;就不难理解了。先说说函数定义&#xff0c;我们都知道&#xff0c;下面的代…

windows找不到文件gpedit.msc_此电脑右键管理提示windows找不到文件的解决方法

也许当你右键点击此电脑管理时&#xff0c;也许会出现Windows找不到文件的提示&#xff0c;下面提供一些解决方法&#xff1a;1、首先按下“Windows”R组合键打开运行&#xff0c;在弹出的“运行“对话框中输入”compmgmt.msc“&#xff0c;点击”确定“&#xff1b;2、如果此时…

java序列化流_java 序列化流与反序列化流

一 对象序列化流ObjectOutputStreamObjectOutputStream 将Java对象的基本数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。注意&#xff1a;只能将支持 java.io.Serializable 接口的对象写入流中用于从流…

【spring boot】注解@ApiParam @PathVariable @RequestParam三者区别

1.ApiParam&#xff0c;就是用于swagger提供开发者文档&#xff0c;文档中生成的注释内容。 ApiOperation( value "编辑公告", notes "编辑公告", httpMethod "POST" )RequestMapping( value "/edit", method RequestMethod.POST…

Zookeeper Watch监听

概述 ZooKeeper -server host:port cmd args stat path [watch] ls path [watch] ls2 path [watch] get path [watch] watch监听有不同的类型&#xff0c;有监听状态的stat &#xff0c;内容的get&#xff0c;目录结构的ls。 命令使用一次&#xff0c;只监听…

win10文件显示后缀名_win10系统,如何去除“此电脑” 里的6个多余文件夹

Windows系统从XP到win7,再到进化到如今的win10&#xff0c;在系统性能和使用便捷性方面&#xff0c;确实改进了很多&#xff0c;但是&#xff0c;金无赤足&#xff0c;没有完美的东西&#xff0c;总是有一些小细节让我们感觉不舒服&#xff0c;如如鲠在喉。比如我们下面看到的这…

ubuntu sun-java6-jre_在 Ubuntu Lucid 下请回 Sun Java6 Jre, 赶走 OpenJDK

Ubuntu Lucid 将 sun-java6-jre 系列包移出了源&#xff0c;java软件用 openjdk系列包提供支持。然而在某些软件(比如FreeRapid)的使用中&#xff0c;openjdk还是喜欢出一些莫名其妙的错误(比如栈溢出)&#xff0c;因此考虑请回sun-java6-jre。具体方法很简单&#xff0c;首先添…

数字化工厂的五大系统_如何搭建以MES系统为核心的数字化工厂?

MES强调车间级的过程集成、控制和监控&#xff0c;以及合理地配置和组织所有资源。满足车间信息化需要&#xff0c;提高车间对随机事件的快速响应和处理能力&#xff0c;有力地促进企业信息化进程向车间层拓展。通过构建以“精益生产、智能制造”为特点的车间管理系统&#xff…

zookeeper数据结构及Znode类型

结构 1、层次化的目录结构&#xff0c;命名符合常规文件系统规范 2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识。 3、节点Znode可以包含数据和子节点&#xff08;但是EPHEMERAL类型的节点不能有子节点&#xff09;。 4、客户端应用可以在节点上设置监视器…

Windows10下手工强制清理删掉安装版的JRE8导致java.exe无法运行的解决办法

error:could not open xxxx.jvm.cfg 参考&#xff1a;https://blog.csdn.net/u010102493/article/details/18425267 1.搜索并删掉C:\Windows\System32下&#xff1a;java*.exe 仍然不行&#xff1a; 在WIN10的开始菜单搜索java C:\ProgramData\Oracle\Java下还有一些东西。 确认…

设计企业网站大纲_企业网站设计布局

网站制作一年350元&#xff0c;五站合一&#xff0c;快速建站 &#xff0c;www.sxjcwzjs.com,只需进入网站右上角注册快速建站即可(需要电脑登录注册)&#xff0c;需要联系我吧&#xff01;电话&#xff1a;13752214574&#xff0c;微信号&#xff1a;m1078582894企业网站布局很…

python画子图_Python使用add_subplot与subplot画子图操作示例

本文实例讲述了Python使用add_subplot与subplot画子图操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;子图&#xff1a;就是在一张figure里面生成多张子图。Matplotlib对象简介FigureCanvas 画布Figure 图Axes 坐标轴(实际画图的地方)注意&#…

vue导入静态js_如何在vue js中加载静态图像

我有一个组件,它接受一个prop字符串,即一个url。它可以是远程图片,也可以是资产文件夹中的本地静态资产。目录结构:-assets/- logo.png-app.vue-components/-ImageTest.vue图像测试.vue{{imagelink}}export default {name: "ImageTest",props:{imagelink: String,},c…

Zookeeper JavaApi 增删改查

官网API http://zookeeper.apache.org/doc/r3.4.6/api/index.html JAR包 \zookeeper-3.3.6\lib\ jline-0.9.94.jar \zookeeper-3.3.6\lib\ log4j-1.2.15.jar \zookeeper-3.3.6\ zookeeper-3.3.6.jar Demo代码 注意代码中的注解 package hello.zookeeper.api;import java.uti…

搭建linux测试环境有什么用_谈谈现在搭建网站用什么程序好,选择对的程序是很重要的开头...

目前可以选择的网站程序还是蛮多的&#xff0c;开源的系统也很多&#xff0c;也有很多精品。更多时候&#xff0c;选择网站程序要结合网站的定位。说说dedecms&#xff0c;就是我们都知道的织梦程序&#xff0c;功能很齐全&#xff0c;作为一个简单的资讯门户网站&#xff0c;算…