节流与防抖:差异、应用场景及示例

前端开发中,我们经常要处理用户频繁触发事件的情况,如滚动、输入等。为了避免事件过度触发导致页面卡顿或异常行为,我们可以采用“节流”和“防抖”两种技术来限制函数的执行次数。

节流(Throttle)

节流是指在一定时间内,只能执行一次函数。比如在滚动页面时,如果每次滚动都触发函数,那么页面会频繁地重绘造成性能问题。我们可以通过节流来限制函数的执行次数,使得函数只有在固定的时间间隔内被调用:

-------- ------------ ------ -
  --- ----- - -----
  ------ ---------- -
    ----- ------- - -----
    ----- ---- - ----------
    -- -------- -
      ----- - --------------------- -
        ----------------- ------
        ----- - -----
      -- -------
    -
  --
-

上面的 throttle 函数接收两个参数,分别是函数 fn 和时间间隔 delay。在函数执行时,先保存当前上下文和参数,并判断 timer 是否为空。如果为空,则表示需要执行函数,否则表示函数已经在定时器中设定了执行时间,不需要再次执行。当定时器执行时,清空 timer 并调用传入的函数。

防抖(Debounce)

防抖是指在一定时间内,只有最后一次操作才会触发函数。比如在输入框中,如果每次输入都触发函数,那么在用户快速输入时可能会导致频繁的网络请求或计算,从而影响系统性能。我们可以通过防抖来限制函数的执行次数,使得函数只在最后一次操作后被调用:

-------- ------------ ------ -
  --- ----- - -----
  ------ ---------- -
    ----- ------- - -----
    ----- ---- - ----------
    -- ------- -
      --------------------
    -
    ----- - --------------------- -
      ----------------- ------
    -- -------
  --
-

上面的 debounce 函数也接收两个参数,分别是函数 fn 和时间间隔 delay。当函数执行时,如果 timer 不为空,则清除之前设定的定时器。然后重新设定一个新的定时器,在延迟时间结束后调用传入的函数。

差异及应用场景

虽然节流和防抖都可以限制函数的执行次数,但它们的实现方式不同,因此适用的场景也不同。

  • 节流:适合在连续触发事件时,需要稳定、固定间隔触发回调的场景,如滚动加载数据。
  • 防抖:适合在连续触发事件时,只需要在最后一次操作后触发回调的场景,如输入框搜索。

示例

下面我们来看一个示例代码,在滚动页面时节流执行函数,在输入框中防抖执行函数:

--------- -----
------
  ------
    ----- --------------- --
    --------------- --- ----------------
  -------
  ------
    ---- ---------------
      ------ ----------- ----------- ----------------------- --
      --- ---------------
    ------
    --------
      -------- ---------- -
        ----- ---- - --------------------------------
        --- ---- - - -- - - --- ---- -
          ----- -- - -----------------------------
          ------------ - ----- --- - ----
          ---------------------
        -
      -

      ----- --------- - -------------------------------------
      ----- ------ - ----------------------------------

      ---------------------------

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------