浅析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 相关文章推荐
AngularJS学习笔记之基本指令(init、repeat)
Jun 16 Javascript
js实现点击切换TAB标签实例
Aug 21 Javascript
深入理解jQuery之防止冒泡事件
May 24 Javascript
静态页面html中跳转传值的JS处理技巧
Jun 22 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
Jul 12 Javascript
JS逻辑运算符短路操作实例分析
Jul 09 Javascript
vue中各选项及钩子函数执行顺序详解
Aug 25 Javascript
JS中注入eval, Function等系统函数截获动态代码
Apr 03 Javascript
vue中使用vue-cli接入融云实现即时通信
Apr 19 Javascript
对vue中的事件穿透与禁止穿透实例详解
Oct 28 Javascript
详解JS函数防抖
Jun 05 Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 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
oracle资料库函式库
2006/10/09 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
jquery ready()的几种实现方法小结
2010/06/18 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
vue实现循环切换动画
2018/10/17 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
python多维数组切片方法
2018/04/13 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
python爬虫智能翻页批量下载文件的实例详解
2021/02/02 Python
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
企业治理工作自我评价
2013/09/26 职场文书
创业计划书怎样才能打动风投
2014/01/01 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
安全教育实施方案
2014/03/02 职场文书
初三学习计划书范文
2014/04/30 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
公司应聘自荐书
2014/06/14 职场文书
介绍信范文大全
2015/05/07 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
旅游安全责任协议书
2016/03/22 职场文书
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS