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 去字符串空格终极版(支持utf8)
Nov 14 Javascript
了解了这些才能开始发挥jQuery的威力
Oct 10 Javascript
js实现点小图看大图效果的思路及示例代码
Oct 28 Javascript
基于JS实现简单的样式切换效果代码
Sep 04 Javascript
JS定义类的六种方式详解
May 12 Javascript
JS如何设置iOS中微信浏览器的title
Nov 22 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Dec 15 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
Vue.js中的computed工作原理
Mar 22 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
Jan 31 Javascript
微信公众平台 发送模板消息(Java接口开发)
Apr 17 Javascript
vue/cli 配置动态代理无需重启服务的方法
May 20 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模板中出现空行解决方法
2011/03/08 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
python处理Excel xlrd的简单使用
2017/09/12 Python
详解Python中的type和object
2018/08/15 Python
python梯度下降法的简单示例
2018/08/31 Python
python 输入一个数n,求n个数求乘或求和的实例
2018/11/13 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
pandas实现导出数据的四种方式
2020/12/13 Python
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
汽车运用工程毕业生自荐信
2013/10/29 职场文书
考察现实表现材料
2014/05/19 职场文书
批评与自我批评总结
2014/10/17 职场文书
车位出租协议书范本
2016/03/19 职场文书
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers