资讯专栏INFORMATION COLUMN

debounce(防抖)和throttle(节流)

2bdenny / 1011人阅读

摘要:防抖防抖,简单来说就是防止抖动。两者间的核心区别就在于持续触发事件时,前者合并事件并在最后时间去触发事件,而后者则是隔间时间触发一次关键知识点定时器闭包资源在线测试源代码

防抖和节流

窗口的resizescroll,输入框内容校验等操作时,如果这些操作处理函数较为复杂或页面频繁重渲染等操作时,如果事件触发的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少触发的频率,同时又不影响实际效果。

debounce 防抖

debounce(防抖),简单来说就是防止抖动。

从上图中我们可以看到,当持续触发事件时,debounce会合并事件且不会去触发事件,当一定时间内没有触发再这个事件时,才真正去触发事件~ 一起来实现个简单的debounce:

</>复制代码

  1. function debounce(fn, delay) {
  2. var ctx;
  3. var args;
  4. var timer = null;
  5. var later = function () {
  6. fn.apply(ctx, args);
  7. // 当事件真正执行后,清空定时器
  8. timer = null;
  9. };
  10. return function () {
  11. ctx = this;
  12. args = arguments;
  13. // 当持续触发事件时,若发现事件触发的定时器已设置时,则清除之前的定时器
  14. if (timer) {
  15. clearTimeout(timer);
  16. timer = null;
  17. }
  18. // 重新设置事件触发的定时器
  19. timer = setTimeout(later, delay);
  20. };
  21. }

效果图:

throttle 节流

throttle(节流),当持续触发事件时,保证隔间时间触发一次事件。

上图中绿色块表示触发一次事件,持续触发事件时,throttle会合并一定时间内的事件,并在该时间结束时真正去触发一次事件~ 一起来看看throttle的简单实现:

</>复制代码

  1. function throttle(fn, delay) {
  2. var ctx;
  3. var args;
  4. // 记录上次触发事件
  5. var previous = Date.now();
  6. var later = function () {
  7. fn.apply(ctx, args);
  8. };
  9. return function () {
  10. ctx = this;
  11. args = arguments;
  12. var now = Date.now();
  13. // 本次事件触发与上一次的时间比较
  14. var diff = now - previous - delay;
  15. // 如果隔间时间超过设定时间,即再次设置事件触发的定时器
  16. if (diff >= 0) {
  17. // 更新最近事件触发的时间
  18. previous = now;
  19. setTimeout(later, delay);
  20. }
  21. };
  22. }

效果图:

总结

根据实际业务场景,合理的利用debounce(防抖)和throttle(节流)可以优化性能和提高用户体验。两者间的核心区别就在于持续触发事件时,前者合并事件并在最后时间去触发事件,而后者则是隔间时间触发一次~

关键知识点

</>复制代码

  1. setTimeout 定时器

  2. </>复制代码

    1. w3school

  3. Closure 闭包

  4. </>复制代码

    1. ruanyifeng

资源 在线测试 源代码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79976.html

相关文章

  • debounce(防抖)throttle(节流)

    摘要:防抖防抖,简单来说就是防止抖动。两者间的核心区别就在于持续触发事件时,前者合并事件并在最后时间去触发事件,而后者则是隔间时间触发一次关键知识点定时器闭包资源在线测试源代码 防抖和节流 窗口的resize、scroll,输入框内容校验等操作时,如果这些操作处理函数较为复杂或页面频繁重渲染等操作时,如果事件触发的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debo...

    ssshooter 评论0 收藏0
  • 函数防抖Debounce函数节流Throttle

    摘要:函数节流函数防抖函数节流和函数防抖函数节流和函数防抖二者很容易被混淆起来。函数防抖函数在特定的时间内不被再调用后执行。一句话概括函数节流是从用户开始输入就开始计时,而函数节流是从用户停止输入开始计时。 函数节流 & 函数防抖 函数节流和函数防抖 函数节流和函数防抖二者很容易被混淆起来。下面贴英文原文,建议认真阅读:Debouncing enforces that a function ...

    NicolasHe 评论0 收藏0
  • 说说JavaScript中函数的防抖 (Debounce) 与节流 (Throttle)

    摘要:基础防抖我们现在写一个最基础的防抖处理标记事件也做如下改写现在试一下,我们会发现只有我们停止滚动秒钟的时候,控制台才会打印出一行随机数。 为何要防抖和节流 有时候会在项目开发中频繁地触发一些事件,如 resize、 scroll、 keyup、 keydown等,或者诸如输入框的实时搜索功能,我们知道如果事件处理函数无限制调用,会大大加重浏览器的工作量,有可能导致页面卡顿影响体验;后台...

    yanwei 评论0 收藏0
  • js 防抖 节流 JavaScript

    摘要:此时需要采用防抖和节流的方式来减少调用频率,同时不影响原来效果。函数防抖当持续触发事件时,一段时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前就触发了事件,延时重新开始。 js 防抖 节流 JavaScript 实际工作中,通过监听某些事件,如scroll事件检测滚动位置,根据滚动位置显示返回顶部按钮;如resize事件,对某些自适应页面调整DOM的渲染;如ke...

    int64 评论0 收藏0
  • 彻底弄懂函数防抖函数节流

    摘要:若时间差大于间隔时间,则立刻执行一次函数。不同点函数防抖,在一段连续操作结束后,处理回调,利用和实现。函数防抖关注一定时间连续触发的事件只在最后执行一次,而函数节流侧重于一段时间内只执行一次。 原博客地址,欢迎star 函数防抖和节流 函数防抖和函数节流:优化高频率执行js代码的一种手段,js中的一些事件如浏览器的resize、scroll,鼠标的mousemove、mouseover...

    Mr_houzi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<