浅析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 相关文章推荐
ext combox 下拉框不出现自动提示,自动选中的解决方法
Feb 24 Javascript
有关js的变量作用域和this指针的讨论
Dec 16 Javascript
javascript五图轮播切换实用版
Aug 17 Javascript
去掉gridPanel表头全选框的小例子
Jul 18 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
Dec 02 Javascript
js随机生成字母数字组合的字符串 随机动画数字
Sep 02 Javascript
每天一篇javascript学习小结(Function对象)
Nov 16 Javascript
jQuery实现简单的网页换肤效果示例
Sep 18 Javascript
easyUI下拉列表点击事件使用方法
May 18 Javascript
js数字滑动时钟的简单实现(示例讲解)
Aug 14 Javascript
vue2单元测试环境搭建
May 24 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 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 pack与unpack 摸板字符字符含义
2009/10/29 PHP
关于PHP5 Session生命周期介绍
2010/03/02 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
python执行外部程序的常用方法小结
2015/03/21 Python
详解django中自定义标签和过滤器
2017/07/03 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Python @property装饰器原理解析
2020/01/22 Python
python_mask_array的用法
2020/02/18 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
QML实现钟表效果
2020/06/02 Python
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
艺术专业大学生自我评价
2013/09/22 职场文书
物流管理专业大学生自荐信
2013/10/04 职场文书
简历自我评价怎么写呢?
2014/01/06 职场文书
根叔历年演讲稿
2014/05/20 职场文书
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle