debounce是啥?

debounce一般被称为防抖动函数,核心目的在于减少函数被触发的频率,从而提高性能。

使用场景

  • 减少resize、mousemove、 scroll等会频繁触发的事件执行次数。比如说我可以通过debounce做到resize结束后100ms才触发事件(因为我们可能不想resize事件被频繁触发,只需要窗口调整结束后再触发即可)
  • 减少ajax请求次数。比如说现在有个需求,要求实现一个用户输入信息的同时从数据库查询相关信息并在前台进行展示,那么很显然,如果直接绑定input事件的话在用户输入的过程中此事件会频繁触发从而导致在短时间内发送多次ajax,一方面会影响性能,另一方面可能会导致用户都输入4个查询关键字了第一次的查询才刚返回,这就会导致查询结果和用户输入不一致的情况,用户体验不好。这种情况其实也可以用debounce来加以解决,如果用户一直在输入就不触发ajax请求,等用户停止输入100ms后立即发送ajax请求。

总之,debounce可以用来控制某个函数被触发的频率,从而提高性能和用户体验

不同的debounce实现

若干时间后触发(事件连续发生时不触发,等到事件发生结束后若干时间才触发操作,比如说等用户调整窗口大小结束后200ms再打印日志)

function debounce(func, wait) {var timeout=null;return function () {var context = this;var args = arguments;if (timeout) {clearTimeout(timeout);}timeout = setTimeout(function () {func.apply(context, args);clearTimeout(timeout);timeout=null;}, wait || 500);}
}// 用户每次停止调整窗口大小200ms后打印日志
window.onresize=debounce(function(){console.log('hello world');
},200);
复制代码

立即触发(事件首次发生时触发,后续连续发生的话不触发事件)

function immediate(func, wait) {var flag = true;var timeout = null;return function () {if (flag) {flag = false;return func.apply(this, arguments);}if (timeout) {clearTimeout(timeout);}timeout = setTimeout(function () {flag = true;}, wait);}
};// 用户开始调整窗口大小时记录日志,后续连续触发的话不记录日志,隔一段时间后首次触发再次记录日志
window.onresize = immediate(function () {console.log('hello world');
}, 200);
复制代码

将延期执行和立即执行合并下(其实就是给debounce函数加个isImmediate参数,有参数的话就在动作发生后立即执行,否则就在动作连续执行后若干时间再执行)

function debounce(func, wait, isImmediate) {if (isImmediate) {return immediate(func, wait);} else {return delayDebounce(func,wait);}
}function immediate(func, wait) {var flag = true;var timeout = null;return function () {if (flag) {flag = false;return func.apply(this, arguments);}if (timeout) {clearTimeout(timeout);}timeout = setTimeout(function () {flag = true;}, wait);}
};function delayDebounce(func, wait) {var timeout = null;return function () {var context = this;var args = arguments;if (timeout) {clearTimeout(timeout);}timeout = setTimeout(function () {func.apply(context, args);clearTimeout(timeout);timeout = null;}, wait || 500);}
}// 用户调整窗口后立即执行
window.onresize = debounce(function () {console.log('hello world');
}, 200, true);// 用户调整窗口结束若干时间后执行
window.onresize = debounce(function () {console.log('hello world');
}, 200);
复制代码

结语

性能优化应该是每个热爱技术的宝宝绕不过的坎,所以,既然绕不过,那就在性能调优的深海里浪里个浪好啦,O(∩_∩)O哈哈~

一次性弄懂debounce相关推荐

  1. 一次性弄懂马尔可夫模型、隐马尔可夫模型、马尔可夫网络和条件随机场!

    1. 马尔可夫网络.马尔可夫模型.马尔可夫过程.贝叶斯网络的区别 相信大家都看过上一节我讲得贝叶斯网络,都明白了概率图模型是怎样构造的,如果现在还没明白,请看我上一节的总结: 贝叶斯网络 这一节我们重 ...

  2. 一次性弄懂马尔可夫模型、隐马尔可夫模型、马尔可夫网络和条件随机场!(词性标注代码实现)

    文章目录 1. 马尔可夫网络.马尔可夫模型.马尔可夫过程.贝叶斯网络的区别 2. 马尔可夫模型 2.1 马尔可夫过程 3. 隐马尔可夫模型(HMM) 3.1 隐马尔可夫三大问题 3.1.1 第一个问题 ...

  3. 弄懂 JavaScript 执行机制,宏任务和微任务

    本文的目的就是要保证你彻底弄懂javascript的执行机制. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出 ...

  4. 一文弄懂Flink网络流控及反压

    一文弄懂Flink网络流控及反压 1. 为什么需要网络流控? 2. 网络流控的实现:静态限速 3. 网络流控的实现:动态反馈/自动反压 3.1 案例一:Storm 反压实现 3.2 案例二:Spark ...

  5. 一次弄懂Event Loop(彻底解决此类面试问题)

    前言 Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理. 为啥要弄懂Event Loop 是要增加自己技术 ...

  6. 99%的人没弄懂volatile的设计原理,更别说灵活运用了

    写volatile的文章非常多,本人也看过许多相关文章,但始终感觉有哪里不太明白,但又说不上来说为什么.可能是过于追求底层实现原理,老想问一个为什么吧. 而写这篇文章的目的很简单,就是突然之间明白了v ...

  7. 计算机基础知识之Unicode-彻底弄懂 Unicode 编码

    彻底弄懂 Unicode 编码 前言 为什么要有编码? 大家需要明确的是在计算机里所有的数据都是字节的形式存储.处理的.我们需要这些字节来表示计算机里的信息.但是这些字节本身又是没有任何意义的,所以我 ...

  8. 计算机二级C语言知识点大全,弄懂这些题集所含知识点稳过(三)

    综合题集知识点三 以下是备考计算机二级C语言冲刺阶段总结的题集中所含的知识点!踏踏实实弄懂每一个知识点,就稳了. 2020年11月6日星期五 补充:不出所料,一次性顺利通过,虽然还是有点不太满意.可能 ...

  9. java接口防抖_彻底弄懂节流和防抖

    节流和防抖 这两个东西,你肯定听过,就是两种优化浏览器性能的手段.相关文章你肯定也看过,如果还是不太清楚,没关系,看完这篇短文,相信你能轻松理解其中差别. 防抖(deounce) 我们先说防抖吧,这里 ...

最新文章

  1. java上机练习01
  2. Karaf 基于 osgi
  3. 搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架
  4. CMD下提示“命令不是内部或外部命令”解决方法
  5. Android工程模块化平台的设计
  6. 爬虫笔记:Python Selenium详解
  7. GDB与远程(交叉)GDB调试
  8. NameNode高可用中editlog同步的过程
  9. C# 中的常用正则表达式汇总
  10. 数字超材料uv坐标matlab,基于数字编码超材料和压缩感知的实孔径雷达成像方法与流程...
  11. Zemax OpticsViewer
  12. 【平面设计基础】11:配色——配色原理
  13. (转)sonicstage 完整删除的方法
  14. 深度学习的四种激活函数
  15. 从一道题理解什么是java的引用
  16. 安科瑞三相电流互感器的规格参数(安科瑞-卓宋兰)
  17. HUD1873看病要排队
  18. 测试用例颗粒度实例列举
  19. $route.push()多次点击跳转报错问题
  20. htc 8x android,颠覆之作的探究,HTC 8X拆解多图欣赏

热门文章

  1. 蘑菇街支付金融Android单元测试实践
  2. 亚马逊高管加入Coinbase
  3. LaTex表格 Itemizeenumerate
  4. 实验二 网络嗅探与身份认证
  5. ArcGIS Online,保守的前进?
  6. 迷你世界手游怎么在电脑上玩?tcgames电脑玩手机游戏助手完美适配
  7. Citrix DDC1912LTSRCU2安装
  8. Go语言笔记:base64/sha1的使用
  9. 数字孪生示范项目——从单摆谈起(4)IoT探索
  10. PyTorch-Geometric安装教程