浅析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 相关文章推荐
多浏览器支持的右下角浮动窗口
Apr 01 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
Apr 01 Javascript
Js 冒泡事件阻止实现代码
Jan 27 Javascript
一个JavaScript用逗号分割字符串实例
Sep 22 Javascript
浅谈javascript实现八大排序
Apr 27 Javascript
JavaScript中通过提示框跳转页面的方法
Feb 14 Javascript
JavaScript中的Number数字类型学习笔记
May 26 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
Oct 31 Javascript
nuxt.js 缓存实践
Jun 25 Javascript
微信小程序生成分享海报方法(附带二维码生成)
Mar 29 Javascript
javascript实现贪吃蛇小游戏
Jul 28 Javascript
Vue仿百度搜索功能
Dec 28 Vue.js
详解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中的日期及时间
2006/11/23 PHP
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
jQuery操作input值的各种方法总结
2013/11/21 Javascript
JS求平均值的小例子
2013/11/29 Javascript
js 操作符汇总
2014/11/08 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
详解redux异步操作实践
2018/08/15 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
Python正则表达式匹配中文用法示例
2017/01/17 Python
用python实现的线程池实例代码
2018/01/06 Python
Python遍历pandas数据方法总结
2018/02/09 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
python实现顺序表的简单代码
2018/09/28 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
python数据化运营的重要意义
2019/11/25 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
2014年业务员工作总结范文
2014/11/17 职场文书
无罪辩护词范文
2015/05/21 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书