浅析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 相关文章推荐
两个DIV等高的JS的实现代码
Dec 23 Javascript
JS重要知识点小结
Nov 06 Javascript
用jquery.sortElements实现table排序
May 04 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
javascript进行四舍五入方法汇总
Dec 16 Javascript
项目中常用的JS方法整理
Jan 30 Javascript
JS获取填报扩展单元格控件的值的解决办法
Jul 14 Javascript
JavaScript中一些特殊的字符运算
Aug 17 Javascript
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
关于vue的语法规则检测报错问题的解决
May 21 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
Jan 18 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
Feb 06 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
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
javascript回调函数详解
2018/02/06 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
python 的列表遍历删除实现代码
2020/04/12 Python
使用Python生成随机密码的示例分享
2016/02/18 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
Python3如何判断三角形的类型
2020/04/12 Python
python中adb有什么功能
2020/06/07 Python
python如何爬取网页中的文字
2020/07/28 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
Delphi笔试题
2016/11/14 面试题
机电专业毕业生推荐信
2013/11/10 职场文书
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS