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 23 Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
jquery加载页面的方法(页面加载完成就执行)
Jun 21 Javascript
关于javascript模块加载技术的一些思考
Nov 28 Javascript
js实现兼容IE和FF的上下层的移动
May 04 Javascript
javascript实现在线客服效果
Jul 15 Javascript
浅谈Javascript数据属性与访问器属性
Jul 26 Javascript
Google 地图类型详解及示例代码
Aug 06 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
Dec 29 Javascript
BootstrapTable加载按钮功能实例代码详解
Sep 22 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
Jun 24 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
Aug 27 jQuery
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注释实例技巧
2008/10/03 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
layui中的switch开关实现方法
2019/09/03 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
python ElementTree 基本读操作示例
2009/04/09 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
积极贯彻学习两会精神总结
2014/03/17 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
2016中秋节问候语
2015/11/11 职场文书
大学生活委员竞选稿
2015/11/21 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python