浅析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 相关文章推荐
提高代码性能技巧谈—以创建千行表格为例
Jul 01 Javascript
jqeury-easyui-layout问题解决方法
Mar 24 Javascript
JavaScript 事件绑定及深入
Apr 13 Javascript
基于insertBefore制作简单的循环插空效果
Sep 21 Javascript
JS正则匹配中文的方法示例
Jan 06 Javascript
Angular+Node生成随机数的方法
Jun 16 Javascript
js实现可以点击收缩或张开的悬浮窗
Sep 18 Javascript
node.js基于express使用websocket的方法
Nov 09 Javascript
Vue 获取数组键名的方法
Jun 21 Javascript
JavaScript闭包原理与用法实例分析
Aug 10 Javascript
node.js文件操作系统实例详解
Nov 05 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
Jul 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实现详细解析
2013/08/24 PHP
php header功能的使用
2013/10/28 PHP
php对包含html标签的字符串进行截取的函数分享
2014/06/19 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
PDO::_construct讲解
2019/01/27 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
Python FTP操作类代码分享
2014/05/13 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
初中优秀班集体申报材料
2014/05/01 职场文书
优质服务演讲稿
2014/05/14 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
单位在职证明书
2014/09/11 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
法制教育观后感
2015/06/17 职场文书
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技