浅析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 相关文章推荐
javascript new 需不需要继续使用
Jul 02 Javascript
js正确获取元素样式详解
Aug 07 Javascript
基于jQuery的ajax功能实现web service的json转化
Aug 29 Javascript
基于jquery实现的鼠标拖拽元素复制并写入效果
Aug 23 Javascript
三种动态加载js的jquery实例代码另附去除js方法
Apr 30 Javascript
javascript引用类型指针的工作方式
Apr 13 Javascript
JQuery 获取Dom元素的实例讲解
Jul 08 jQuery
JS实现按钮控制计时开始和停止功能
Jul 27 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 jQuery
详解基于Koa2开发微信二维码扫码支付相关流程
May 16 Javascript
Vue头像处理方案小结
Jul 26 Javascript
js实现简单贪吃蛇游戏
May 15 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/03/27 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
Jquery 学习笔记(一)
2009/10/13 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
python暴力解压rar加密文件过程详解
2019/07/05 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
美国现代家具购物网站:LexMod
2019/01/09 全球购物
自荐信的禁忌和要点
2013/10/15 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
公司担保书格式范文
2014/05/12 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
世界遗产的导游词
2015/02/13 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
浅析python中特殊文件和特殊函数
2022/02/24 Python