throttle和debounce

简介: throttle和debounce

debounce 与 throttle 是开发中常用的高阶函数,作用都是为了防止函数被高频调用,换句话说就是,用来控制某个函数在一定时间内执行多少次。

使用场景:比如绑定响应鼠标移动、窗口大小调整、滚屏等事件时,绑定的函数触发的频率会很频繁。若稍处理函数微复杂,需要较多的运算执行时间和资源,往往会出现延迟,甚至导致假死或者卡顿感。为了优化性能,这时就很有必要使用debounce或throttle了。

由于debounce与throttle两个函数的作用相同,且调用方法和参数都相同,这让我们很容易弄混。今天就来谈谈debounce和throttle的用法与差异。

下面先看看lodash中的.debounce()与.throttle()。

_.debounce(func, [wait=0], [options={}]);

_.throttle(func, [wait=0], [options={}]);

1. debounce

语法:

_.debounce(func, [wait=0], [options={}])

debounce函数通常称为防抖动函数,该函数会从上一次被调用后,延迟 wait 毫秒后调用 fn 方法

适用场景:

按钮提交:防止多次提交,只执行最后一次提交

搜索框联想场景:防止联想发送请求,只发送最后一次输入

简单实现


function debounce(fn, wait, options) {   
  wait = wait || 0;
  var timerId;
  function debounced() {   
    if (timerId) {   
      clearTimeout(timerId);
      timerId = null;   
    }   
    timerId = setTimeout(function() {   
      fn();     
    }, wait);
  }
  return debounced;
 }

当事件被执行时,并不会立刻执行fn,而是等待一定时间(wait)后才会执行。如果wait过后,函数没有再次被执行,就会处理最后一个fn。

2. Throttle

语法:

_.throttle(func, [wait=0], [options={}])

throttle:规定在单位时间内,只能触发一次函数,如果这个单位时间触发多次,只有一次生效

使用场景:

拖拽场景

缩放:监控浏览器resize

简单实现

function throttle(fn, wait, options) {   
  wait = wait || 0;   
  var timerId, lastTime = 0;    

  function throttled() {   
    var currentTime = new Date();   
      if (currentTime >= lastTime + wait) {   
        fn();   
        lastTime = currentTime;
      } else {
        if (timerId) {
          clearTimeout(timerId);
          timerId = null;
        }
        timerId = setTimeout(function() {
          fn();
        }, wait);
     }
  }
  return throttled;
}

在上面的代码中,我们会记录每次函数被实际调用的时间,如果下次调用时,还没到达阀值,就会继续等待,直到到达阀值,就会调用最后一次函数。

const debounce300LoadMore = debounce(300, false, this.getMore);
window.addEventListener('scroll', debounce300LoadMore, {
  passive: false
});

两者区别:

节流不管事件触发多频繁保证在一定时间内一定会执行一次函数。防抖是只在最后一次事件触发后才会执行一次函数

问题: 多个tab标签,如何保证每次点击tab加载的都是对应的准确数据

目录
相关文章
|
4天前
|
前端开发 JavaScript UED
【专栏】如何理解 debounce(防抖)和 throttle(节流)
【4月更文挑战第29天】前端开发中,为解决用户操作引发的性能问题,常使用debounce(防抖)和throttle(节流)技术。Debounce确保在一段时间内只执行最后一次事件触发的操作,减少不必要的执行,但有滞后性,适合搜索框实时搜索。Throttle则保证一定时间间隔内函数执行一次,保持固定频率,适用于滚动事件处理和窗口大小调整。两者可借助JavaScript或第三方库实现,需根据场景和需求选择并调整。正确使用能提升应用性能和用户体验。
|
25天前
uView throttle & debounce节流防抖
uView throttle & debounce节流防抖
17 0
|
6月前
|
前端开发
setInterval
setInterval
24 0
|
6月前
|
消息中间件 JavaScript 前端开发
setTimeout和setInterval
setTimeout和setInterval
防抖(debounce)& 节流(throttle)
防抖(debounce)& 节流(throttle)
79 0
16、计时器方法2(setTimeout、clearTimeout、防抖、节流)
16、计时器方法2(setTimeout、clearTimeout、防抖、节流)
95 0
|
监控 JavaScript 前端开发
细说节流(Throttle)和防抖(Debounce)
节流(Throttle)和防抖(Debounce)对于前端开发人员来说应该是十分熟悉的,节流(Throttle)和防抖(Debounce)是两种可以节省性能的编程技术,两者的目的都是为了优化性能,提高用户体验,都是基于 DOM 事件限制正在执行的 JavaScript 数量的方法。但两者的有什么不一样呢?
228 0
细说节流(Throttle)和防抖(Debounce)
|
前端开发 数据库 UED
如何理解debounce(防抖)和throttle(节流)?
前端工程师们都听过看起来很高级的词,节流和防抖,其实节流就是throttle,防抖就是debounce,其实这个也属于前端性能优化的一部分。
如何理解debounce(防抖)和throttle(节流)?
|
JavaScript C++
【面试题】debounce vs throttle
debounce 和 throttle 是面试时经常会被问到的一道 JS 题。我自己在第一次找工作的时候,就被问过。当时被问得半天说不出两者的区别,说着说着就把自己带入坑了。 今天就跟大家分享一下这两者的区别吧。
【面试题】debounce vs throttle
|
JavaScript
关于Js debounce(防抖)函数和throttle(节流)小结
关于Js debounce(防抖)函数和throttle(节流)小结