浅析JavaScript 函数防抖和节流


Posted in Javascript onJuly 13, 2020

函数防抖和节流都是对高频动作触发回调函数的一个优化,实现方式上有类似之处。先从使用场景做个区分。

防抖使用场景:

  • 表单输入框校验
  • 提交按钮避免重复提交

节流使用场景:

  • scroll,mousemove,resize等

函数防抖(debounce)

表单输入框校验在用户不停的打字输入时并不需要向后台校验文本,只有当用户停下来一定时间后,这时候默认用户已经输入完毕了可以开始向后台提交文本了。

表单的提交按钮被用户多次连续点击时,显然并不需要每次点击都提交表单。仅在用户不点击之后,把最后一次的点击操作执行即可。

防抖函数的适用场景都有一个共同特点,就是高频触发并不会立即高频的执行,只有在结束高频触发一定时间间隔之后,执行最后一次触发。

代码实现就很简单了,短时间高频触发则重置计时器,计时器到达指定时间后,方才执行回调函数

var debounce = function (func, wait) {
  var timer;
  return function () {
    var self = this, args = arguments;
    if (timer) clearTimeout(timer);
    timer = setTimeout(function () {
      func.apply(self, args);
    }, wait);
  }
}
/**
这里使用闭包是为了保存计时器,而不是定义一个全局变量来存放计时器。apply的作用则是为了处理this指向和参数的传递,因为setTimeout会将this指向window。
*/

函数节流(throttle)

在触发频率很高的场景中,通常并不需要以同样的高频来执行回调函数,这时候需要人为的控制回调函数执行频率,以一个固定的较低频率来执行。

实现原理是,记录第一次触发时间,之后每次触发都对比是否到达指定的间隔时间,只有大于等于指定间隔才会再次执行,并重新开始记录触发时间。

可以用时间戳记录并计算出时间间隔,同样也可以用计时器来控制时间间隔。

var throttle = function (func, wait) {
  var timer;
  return function () {
    var self = this, args = arguments;
    if (!timer) {
      timer = setTimeout(function () {
        func.apply(self, args)
        clearTimeout(timer)
        timer = null;
      }, wait)
    }
  }
}

最后用一张图来对比防抖和节流函数的执行的频率,可视化实现

浅析JavaScript 函数防抖和节流

以上就是浅析JavaScript 函数防抖和节流的详细内容,更多关于JavaScript 函数防抖和节流的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js数字输入框(包括最大值最小值限制和四舍五入)
Nov 24 Javascript
js png图片(有含有透明)在IE6中为什么不透明了
Feb 07 Javascript
解决jQuery插件tipswindown与hintbox冲突
Nov 05 Javascript
jquery html动态生成select标签出问题的解决方法
Nov 20 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
Jan 18 Javascript
深入浅析AngularJS和DataModel
Feb 16 Javascript
JS中取二维数组中最大值的方法汇总
Apr 17 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
Dec 01 Javascript
vue axios整合使用全攻略
May 24 Javascript
Vue兼容ie9的问题全面解决方案
Jun 19 Javascript
基于React Native 0.52实现轮播图效果
Aug 25 Javascript
Vue和React组件之间的传值方式详解
Jan 31 Javascript
详解JavaScript 异步编程
Jul 13 #Javascript
javascript canvas时钟模拟器
Jul 13 #Javascript
微信小程序整个页面的自动适应布局的实现
Jul 12 #Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
Jul 12 #Javascript
微信小程序实现列表滚动头部吸顶的示例代码
Jul 12 #Javascript
Js on及addEventListener原理用法区别解析
Jul 11 #Javascript
JS call()及apply()方法使用实例汇总
Jul 11 #Javascript
You might like
php数据库连接
2006/10/09 PHP
php cli 小技巧
2013/06/03 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
js实现3D旋转效果
2020/08/18 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
python字符串常用方法
2018/06/14 Python
python3中zip()函数使用详解
2018/06/29 Python
Python pymongo模块常用操作分析
2018/09/01 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
Python 如何批量更新已安装的库
2020/05/26 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
幼儿园毕业园长感言
2014/02/24 职场文书
夏季药店促销方案
2014/08/22 职场文书
委托书怎样写
2014/08/30 职场文书
护士先进个人总结
2015/02/13 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书