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 相关文章推荐
最简单的jQuery程序 入门者学习
Jul 09 Javascript
Textarea与懒惰渲染实现代码
Jan 04 Javascript
jquery网页元素拖拽插件效果及实现
Aug 05 Javascript
js call方法详细介绍(js 的继承)
Nov 18 Javascript
jQuery后代选择器用法实例
Dec 23 Javascript
JavaScript入门基础
Aug 12 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
May 27 Javascript
微信小程序 action-sheet底部菜单详解
Oct 27 Javascript
JavaScript实现简单图片轮播效果
Aug 21 Javascript
详解JavaScript 中 if / if...else...替换方式
Jul 15 Javascript
解决node-sass偶尔安装失败的方法小结
Dec 05 Javascript
使用uni-app开发微信小程序的实现
Dec 13 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基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
python的random模块及加权随机算法的python实现方法
2017/01/04 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
python数据结构之列表和元组的详解
2017/09/23 Python
简单实现python数独游戏
2018/03/30 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
Python的形参和实参使用方式
2019/12/24 Python
机械工程系毕业生求职信
2013/09/27 职场文书
银行柜员应聘推荐信范文
2013/11/24 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
初中军训感想300字
2014/03/05 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
会计系毕业生求职信
2014/05/28 职场文书
2014年团总支工作总结
2014/11/21 职场文书
出国导师推荐信
2015/03/25 职场文书
开学典礼观后感
2015/06/15 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
宿舍管理制度范本
2015/08/07 职场文书