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,一经查实,立即删除!

相关文章

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

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

Spring Data JPA 实例查询

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

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

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

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

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

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

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

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

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

zookeeper数据结构及Znode类型

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

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

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

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

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

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

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

Zookeeper应用:服务端上下线

需求 客户端感知服务器的上下线。 示意图 步骤 服务端: 1、所有机子向Zookeeper注册,注册znode为临时的。 2、有机子下线,连接断开后被Zookeeper自动删除,触发监听事件。 3、有机子上线,触发监听事件。 客户端&am…

哈希表查找失败的平均查找长度_你还应该知道的哈希冲突解决策略

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA作者:Xuegui Chen哈希是一种通过对数据进行压缩, 从而提高效率的一种解决方法,但由于哈希函数有限,数据增大等缘故,哈希…

python 正则替换_5分钟速览Python正则表达式常用函数!五分钟就掌握它!

导读:正则表达式是处理字符串类型的"核武器",不仅速度快,而且功能强大。本文不过多展开正则表达式相关语法,仅简要介绍python中正则表达式常用函数及其使用方法,以作快速查询浏览。01 Re概览Re模块是python的…

oracle 分组_大数据分组怎样才会更快

分组是数据库的常见运算,无论数据如何准备,通常都需要将所有数据遍历。建立索引这时是不起作用的,存储格式才是决定遍历效率的主要因素。数据库中数据的存放虽然是二进制格式的,但普遍IO性能差,库内遍历快,…

java下拉树_参数模板中下拉树级联下拉数据集查询

背景说明在参数表单的制作中会遇到各种各样的需求,如为了方便参数的输入,需要将输入框设计成树状;若参数模板中有两个输入框,每个输入框对应的参数有某种关系,前一个输入框输入参数后,后一个输入框自动关联…

java8 list 行转列_太赞了,Intellij IDEA 竟然把 Java8 的数据流问题这么完美的解决掉了!

使用 IntelliJ IDEA 来帮忙构建你自己的实时模板连接分组《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spr…

beautifulsoup爬取网页中的表格_用 Python 爬取网页

来自公众号:优达学城Udacity作者:Kerry Parker编译:欧剃作为数据科学家的第一个任务,就是做网页爬取。那时候,我对使用代码从网站上获取数据这项技术完全一无所知,它偏偏又是最有逻辑性并且最容易获得的数据…

pyecharts添加文字_超燃的文字云效果,用Python就能轻松get!

本文转载自公众号:数据森麟(ID:shujusenlin)作者:叶庭云链接:https://blog.csdn.net/fyfugoyfa/ 01 / 词云图词云图是一种用来展现高频关键词的可视化表达,通过文字、色彩、图形的搭配,产生有冲击力地视觉效…

mysql 创建视图 主键_MySQL数据库基础操作命令,本文助你更上一层楼!

今天介绍的是关于Mysql数据库一些操作的基础命令用户与权限创建用户mysql>create user test identified by BaC321#; 修改密码5.5版本及以前的命令mysql>set password for testpassowrd(!1A2#3); 5.6及以上命令mysql>update mysql.user set authentication_stringpass…

mysql 聚合函数 怎么用在条件里_MySql 中聚合函数增加条件表达式的方法

Mysql 与聚合函数在一起时候where条件和having条件的过滤时机where 在聚合之前过滤当一个查询包含了聚合函数及where条件&#xff0c;像这样的情况select max(cid) from t where t.id<999这时候会先进行过滤&#xff0c;然后再聚合。先过滤出ID《999的记录&#xff0c;再查找…