浅析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 相关文章推荐
父子窗体间传递JSON格式的数据的代码
Dec 25 Javascript
jquery ajax 局部无刷新更新数据的实现案例
Feb 08 Javascript
什么是Node.js?Node.js详细介绍
Jun 01 Javascript
js中函数声明与函数表达式
Jun 03 Javascript
JS简单实现城市二级联动选择插件的方法
Aug 19 Javascript
详解JavaScript逻辑And运算符
Dec 04 Javascript
前端程序员必须知道的高性能Javascript知识
Aug 24 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
Mar 01 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
Feb 05 Javascript
vue中axios请求的封装实例代码
Mar 23 Javascript
js前端面试之同步与异步问题详解
Apr 03 Javascript
layui--select使用以及下拉框实现键盘选择的例子
Sep 24 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程序的多种方法介绍
2014/11/06 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
Python的Flask框架中Flask-Admin库的简单入门指引
2015/04/07 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
Python socket模块方法实现详解
2019/11/05 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
教学评估实施方案
2014/03/16 职场文书
教师四风问题对照检查材料
2014/09/26 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
vue项目支付功能代码详解
2022/02/18 Vue.js