JS中的防抖与节流及作用详解


Posted in Javascript onApril 01, 2019

概念

函数防抖(debounce)是指在一定时间内,在动作被连续频繁触发的情况下,动作只会被执行一次,也就是说当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间,所以短时间内的连续动作永远只会触发一次,比如说用手指一直按住一个弹簧,它将不会弹起直到你松手为止。

函数节流是指一定时间内执行的操作只执行一次,也就是说即预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期,一个比较形象的例子是如果将水龙头拧紧直到水是以水滴的形式流出,那你会发现每隔一段时间,就会有一滴水流出。

函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。

下面通过示例代码看下防抖和节流。

什么是防抖?and什么是节流?一起来开心的学习下吧。

首先什么是防抖:就是在一定的时间内事件只发生一次,比如你点击button按钮,1秒内任你单身30年手速点击无数次,他也还是只触发一次。举个例子,当你在页面中使用onkeyUp监听用户在input框中的输入,如果用户按住一个6不放,那监听事件岂不是一直被触发,这样就浪费了一部分性能了,那么我们在一定事件内监听,也就是说我过了一秒再来看看你输入了多少个6,那这样是不是轻松多了。ok,解释清楚了那么就来看下代码,更加清晰。

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>防抖</title>
</head>
<body>
 <button id="debounce">防抖,防抖,防抖</button>
 <script>
 window.onload = function () {
  let obtn = document.getElementById('debounce'); //获取按钮
 obtn.addEventListener('click',debounceHandle(debounce),false); //监听绑定事件
 }

 //防抖函数
 function debounceHandle (fn) {
  let timer = null;
  return function () {
  clearTimeout(timer); //如果存在事件就清除定时器
  timer = setTimeout(function(){ //如果不存在那么就开启定时器
   fn.call(this,arguments);
  },300)
  }
 }

 //执行函数
 function debounce() {
  console.log('防抖,防抖,防抖');
 }
 </script>
</body>
</html>

上面函数也就是在300毫秒内,只会触发一次事件。总结:防抖就是在任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。

接下来什么是节流,假如在一个页面中有任意多张图片,那么就有可能会使用懒加载技术,懒加载呢就是监听滚动条的位置,那么如果用户一直在滚动,那么事件监听就一直在触发,也是浪费性能。那么节流就是在一定时间间隔内触发一次事件。话不多说,先看代码。

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>节流</title>
 <style>
 div {
  height: 5000px;
 }
 </style>
</head>
<body>
 <div>节流,节流,节流</div>
 <script>
 window.onload = function () {
  window.addEventListener('scroll',throttleHandle(throttle),false); //监听绑定事件
 }

 //节流函数
 function throttleHandle (fn) {
  let timer = null,
   booleanVal = true; // 声明一个变量标志做判断
  return function () {
   if (!booleanVal) {
   return 
   } //如果事件正在执行,那么就返回,将布尔值改为false
   booleanVal = false;
   //事件未执行,创建事件
   timer = setTimeout(function() {
   fn.apply(this,arguments);
   booleanVal = true; //事件执行完将布尔值改回
   },300)
  }
 }

 //执行函数
 function throttle() {
  var scrollNum = document.documentElement.scrollTop || document.body.scrollTop;
  console.log(scrollNum);
 }
 </script>
</body>
</html>

这样,在某些特定的工作场景,我们就可以使用防抖与节流来减少不必要的损耗。最后提一个问题,上句提到造成不必要的损耗,那么请问是什么损耗呢?

总结

以上所述是小编给大家介绍的JS中的防抖与节流及作用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js异步加载的三种解决方案
Mar 04 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
通过实例理解javascript中没有函数重载的概念
Jun 03 Javascript
jQuery实现摸拟alert提示框
May 22 Javascript
JS中的phototype详解
Feb 04 Javascript
jQuery ajax请求struts action实现异步刷新
Apr 19 jQuery
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
May 11 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
Sep 20 Javascript
原生JS上传大文件显示进度条 php上传文件代码
Mar 27 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
Oct 21 Javascript
swiper Scrollbar滚动条组件详解
Sep 08 Javascript
Vue中添加滚动事件设置的方法详解
Sep 14 Javascript
微信小程序 slot踩坑的解决
Apr 01 #Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 #Javascript
VUE脚手架的下载和配置步骤详解
Apr 01 #Javascript
详解JavaScript中的函数、对象
Apr 01 #Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
Apr 01 #Javascript
基于vue框架手写一个notify插件实现通知功能的方法
Mar 31 #Javascript
基于elementUI实现图片预览组件的示例代码
Mar 31 #Javascript
You might like
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
2017/01/13 Javascript
React快速入门教程
2017/01/17 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
Django REST framwork的权限验证实例
2020/04/02 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
2020/10/29 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
final, finally, finalize的区别
2012/03/01 面试题
车工岗位职责
2013/11/26 职场文书
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python