浅析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 相关文章推荐
跨浏览器的设置innerHTML方法
Sep 18 Javascript
dess中一个简单的多路委托的实现
Jul 20 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
Sep 13 Javascript
IE6浏览器下resize事件被执行了多次解决方法
Dec 11 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
js实现局部页面打印预览原理及示例代码
Jul 03 Javascript
jQuery制作拼图小游戏
Jan 12 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
Jan 04 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
Aug 01 Javascript
js仿iphone秒表功能 计算平均数
Jan 11 Javascript
Vuex 入门教程
Jan 10 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
Jan 05 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 实现从数据库导出到.csv文件方法
2017/07/06 PHP
php实现微信发红包功能
2018/07/13 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
js获取Get值的方法
2016/09/29 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python实现字典依据value排序
2016/02/24 Python
Python单例模式的两种实现方法
2017/08/14 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
python设置表格边框的具体方法
2020/07/17 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
毕业自我评价范文
2013/11/17 职场文书
中层干部岗位职责
2013/12/18 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
广播体操比赛口号
2014/06/10 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书