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 相关文章推荐
统一接口:为FireFox添加IE的方法和属性的js代码
Mar 25 Javascript
DWZ table的原生分页浅谈
Mar 01 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
$.each遍历对象、数组的属性值并进行处理
Jul 18 Javascript
让浏览器DOM元素最后加载的js方法
Jul 29 Javascript
使用jQuery设置disabled属性与移除disabled属性
Aug 21 Javascript
Bootstrap每天必学之模态框(Modal)插件
Apr 26 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
Aug 01 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
Sep 20 Javascript
vue 自定义提示框(Toast)组件的实现代码
Aug 17 Javascript
微信小程序发送短信验证码完整实例
Jan 07 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
Apr 17 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
php 常用类汇总 推荐收藏
2010/05/13 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
详解php协程知识点
2018/09/21 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
PHP实现简单的计算器
2020/08/28 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
JS Array对象入门分析
2008/10/30 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
Python: 传递列表副本方式
2019/12/19 Python
django列表筛选功能的实现代码
2020/03/27 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
Python json格式化打印实现过程解析
2020/07/21 Python
python使用smtplib模块发送邮件
2020/12/17 Python
史泰博(Staples)中国官方网站:办公用品一站式采购
2016/09/05 全球购物
幼儿园中秋节活动方案
2014/02/06 职场文书
委托协议书范本
2014/04/22 职场文书
停发工资证明范本
2015/06/12 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL
Java对文件的读写操作方法
2022/04/29 Java/Android
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL
MySQL主从切换的超详细步骤
2022/06/28 MySQL