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 相关文章推荐
浅谈JavaScript中的String对象常用方法
Feb 25 Javascript
JS实用的动画弹出层效果实例
May 05 Javascript
手机端页面rem宽度自适应脚本
May 20 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
Jul 18 Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 Javascript
webpack3+React 的配置全解
Aug 21 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
Dec 14 Javascript
JSON的parse()方法介绍
Jan 31 Javascript
vue组件之间通信方式实例总结【8种方式】
Feb 22 Javascript
javascript 对象 与 prototype 原型用法实例分析
Nov 11 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
Nov 13 Javascript
JS实现多选框的操作
Jun 24 Javascript
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
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
人大复印资料处理程序_输入篇
2006/10/09 PHP
纯php生成随机密码
2015/10/30 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
Python安装Bs4的多种方法
2020/11/28 Python
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
C++面试题目
2013/06/25 面试题
CLR与IL分别是什么含义
2016/08/23 面试题
送餐员岗位职责范本
2014/02/21 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
企业口号大全
2014/06/12 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
OpenCV-Python实现油画效果的实例
2021/06/08 Python
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers