js防抖函数和节流函数使用场景和实现区别示例分析


Posted in Javascript onApril 11, 2020

本文实例讲述了js防抖函数和节流函数使用场景和实现区别。分享给大家供大家参考,具体如下:

开发过程中,都遇到过某个事件被频发触发的场景,比如resize,scroll事件,input事件,而对应的事件处理函数也会被高频率调用,这时会增加浏览器负担,用户体验也不好,这也是防抖函数和节流函数存在的意义和使用场景。

函数防抖(debounce):

持续触发事件时,在设定时间段内没有被触发,才去调用事件处理函数,在设定时间段内如果事件又被触发,则不调用事件处理函数,并从触发事件时间重新开始延时。

具体实现:

设计思路:在setTimeout中调用事件处理函数,如果在定时器触发函数执行之前又触发函数,清除定时器。

function debounce(fn, timeout){
  timeout = timeout || 1000;
  let timer;
  return () => {
    if(timer){ clearTimeout(timer)}
    timer = setTimeout(() => {
      fn()
    },timeout)
  }
}
 
function printEvent(){
  console.log('1121212')
}
 
window.addEventListener('scroll',debounce(printEvent,1000),false)

节流函数(throttle)  throttle   ['θrɑt(ə)l]  油门;节气门;扼杀

当事件被持续触发时,在设定时间内只让事件处理函数触发一次。

定时器实现模式:定时器在延时时间执行过后,重置为null, 定时器为null时,重新设置定时器,如此循环

//节流函数
function throttle(fn, range){
  range = range || 1000;
  let timer;
  return () => {
    //console.log(111,typeof timer)
    if(!timer){
      timer = setTimeout( () => {
        fn()
        timer = null
      },range)
    }
  }
}
 
window.addEventListener('mousemove',throttle(printEvent,1000),false)

时间戳实现模式:初始化时获取时间,每次触发事件时再次获取时间,两次时间间隔等于或大于设定时间,执行事件,初始化时间重置为当前时间,如此循环。

//节流函数 时间戳模式
var throttle2 = function(func, delay) {
var prev = Date.now();

return function() {


var context = this;


var args = arguments;


var now = Date.now();


if (now - prev >= delay) {



func.apply(context, args);



prev = Date.now();


}

}
}

也可以使用时间戳加定时器结合实现:

总结:

函数防抖:在无事件触发后的设定时间执行事件,将几次操作合并为一此操作进行。这样一来,只有最后一次操作能被触发。

函数节流:使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数。

区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。

比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JS案例分享之金额小写转大写
May 15 Javascript
Angularjs 基础入门
Dec 26 Javascript
详解用node.js实现简单的反向代理
Jun 26 Javascript
Vue代码分割懒加载的实现方法
Nov 23 Javascript
基于vue.js无缝滚动效果
Jan 25 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
Jan 31 Javascript
vue2.0 根据状态值进行样式的改变展示方法
Mar 13 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
手挽手带你学React之React-router4.x的使用
Feb 14 Javascript
es6数组includes()用法实例分析
Apr 18 Javascript
ztree+ajax实现文件树下载功能
May 18 Javascript
vue实现锚点定位功能
Jun 29 Vue.js
js函数柯里化的方法和作用实例分析
Apr 11 #Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
Apr 11 #Javascript
JavaScript运行机制实例分析
Apr 11 #Javascript
js中调用微信的扫描二维码功能的实现代码
Apr 11 #Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
Apr 11 #Javascript
微信分享invalid signature签名错误踩过的坑
Apr 11 #Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
Apr 11 #Javascript
You might like
PHP四舍五入精确小数位及取整
2014/01/14 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
JavaScript 加号(+)运算符号
2009/12/06 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
初步解析Python下的多进程编程
2015/04/28 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
如何把python项目部署到linux服务器
2020/08/26 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
中国制造网:Made-in-China.com
2019/10/25 全球购物
校企合作协议书
2014/04/16 职场文书
普通党员对照检查材料
2014/09/24 职场文书
党员个人剖析材料
2014/09/30 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python