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. 重温强化学习之策略梯度算法
  2. java继承对象转换_java中类与对象的继承重写,存储以及自动转换和强制转换。...
  3. 上传更新的代码到gitlab
  4. Express 极速掌握
  5. 实验7-3-4 字符串替换 (15 分)
  6. 水晶报表2008部署
  7. Cisco实例1—构建高可用性DM×××网络2—方案设计
  8. UT斯达康首家手机网上专卖店落户淘宝网
  9. 利用Crimestat(犯罪统计)软件进行空间分析
  10. 软件开发学习的5大技巧,你知道吗?
  11. AE开发之图层渲染20210603
  12. CV:阿里在CV数据增强领域带来SOTA新范式(已被NeurIPS2022接收)—基于离散化对抗训练的鲁棒视觉新基准!
  13. 2019年E题薄利多销问题
  14. css3+html5——机器猫哆啦A梦+手、脚、头动起来!
  15. 图的概念与主要类型、图模型的应用场景
  16. 2021年全球与中国不锈钢反应堆行业市场规模及发展前景分析
  17. android p支持4.1,版本过老 Android P将不再支持这类应用
  18. 公务员事业单位面试备考和提升方法,看这一篇就够了
  19. 可以发布新闻稿的平台有哪些?
  20. 工程学导论之职业道德

热门文章

  1. 帧数达不到144用144hz_科普一下144HZ显示器,可能很多人有误区,帮你们解答!...
  2. python中until的用法_python之selenium随记(几种等待的用法)
  3. 数据库三大范式(通俗理解)
  4. 重装Win10卡在准备就绪
  5. 布线问题-分支限界法
  6. Linux查看tcp连接数
  7. js数组怎么删除指定元素?
  8. 教你6招快速美白牙齿
  9. 计算机学院学生会会徽设计,计算机工程学院学生会会徽与会旗
  10. c语言substr函数的优点,C/C++中substr函数的应用(简单讲解)详解