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函数
Jun 23 Javascript
深入分析JSONP跨域的原理
Dec 10 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
Dec 20 Javascript
jQuery的context属性用法实例
Dec 27 Javascript
深入探讨javascript中的数据类型
Mar 04 Javascript
AngularJs实现ng1.3+表单验证
Dec 10 Javascript
跨域资源共享 CORS 详解
Apr 26 Javascript
JSON 必知必会 观后记
Oct 27 Javascript
微信小程序 wx.request方法的异步封装实例详解
May 18 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
Nov 10 Javascript
Vue如何实现响应式系统
Jul 11 Javascript
分享一个vue实现的记事本功能案例
Apr 11 Vue.js
微信小程序 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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
joomla组件开发入门教程
2016/05/04 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
jQuery 使用个人心得
2009/02/26 Javascript
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
Django URL传递参数的方法总结
2016/08/28 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
pytest中文文档之编写断言
2019/09/12 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
教师实习期自我鉴定
2013/10/06 职场文书
怎样写好创业计划书的内容
2014/02/06 职场文书
临床医师个人自我评价
2014/04/06 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
阿甘正传观后感
2015/06/01 职场文书
小型婚礼主持词
2015/06/30 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
六五普法心得体会2016
2016/01/21 职场文书
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
python开发飞机大战游戏
2021/07/15 Python