浅析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 相关文章推荐
获取DOM对象的几种扩展及简写
Oct 09 Javascript
javascript import css实例代码
Jul 18 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
Dec 28 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
Oct 24 Javascript
浅谈javascript事件取消和阻止冒泡
May 26 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
Oct 23 Javascript
jQuery中JSONP的两种实现方式详解
Sep 26 Javascript
jquery ajaxfileupload异步上传插件使用详解
Feb 08 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
Apr 27 Javascript
jQuery zTree树插件动态加载实例代码
May 11 jQuery
angular6.0开发教程之如何安装angular6.0框架
Jun 29 Javascript
解决vue自定义全局消息框组件问题
Nov 22 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(6) 面向对象
2010/02/16 PHP
php 求质素(素数) 的实现代码
2011/04/12 PHP
php读取3389的脚本
2014/05/06 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
Jquery 表格合并的问题分享
2011/09/17 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
JavaScript函数详解
2015/02/27 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
详解vue高级特性
2020/06/09 Javascript
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
Python之文字转图片方法
2018/05/10 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
解决python flask中config配置管理的问题
2019/07/26 Python
Django中FilePathField字段的用法
2020/05/21 Python
python使用建议与技巧分享(二)
2020/08/17 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
厨房工作人员岗位职责
2013/11/15 职场文书
社区学习十八大感想
2014/01/22 职场文书
运动会入场词100字
2014/02/06 职场文书
校园活动策划方案
2014/06/13 职场文书
公司财务管理制度
2015/08/04 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
新手初学Java网络编程
2021/07/07 Java/Android