Skip to content

节流与防抖

关于

防抖:字面意思,防止抖动,规定时间内,频繁触发事件会被重置,避免事件被失误触发多次。

节流:控制流量,规定时间内,事件只会触发一次。

实现方法

防抖

实现方法:每次执行前判断当前是否有延时函数等待执行,如果有,就清空。

代码实现重在清零 clearTimeout,多用于添加按钮,输入信息等需要频繁发送请求的地方。

js
function debounce(fn, delay = 500) {
  let timer
  return () => {
    if (timer) clearTimeout(timer) // 有定时器未执行就清除。
    timer = setTimeout(() => {
      fn.apply(this, arguments)
    }, delay)
  }
}

具体实现可以查看代码块

节流

实现方法:每次执行前会判断当前是否有等待执行的延时函数,如果有则 return

代码实现重在控制什么时候 return,多用于计算鼠标移动,下拉滚动等事件。

js
function throttle(fn, delay = 500) {
  let timer
  return () => {
    if (timer) {
      return
    } // 有定时器未执行就退出。
    timer = setTimeout(() => {
      fn.apply(this, arguments)
      timer = null
    }, delay)
  }
}

具体实现可以查看代码块

总结

  • 防抖:

所谓防抖,就是高频触发事件,但是在 n 秒内只会执行一次。在此期间再次被触发,则会重新计算执行时间。

  • 节流:

所谓节流,就是在连续触发事件后的 n 秒内,只会执行一次方法,如果在此期间再次被触发,直接 return 退出

提炼:防抖就是控制次数,节流就是控制频率。需要根据业务需求来决定使用什么方法。

代码块

下列代码放入 .html 文件中。

html
<button id="debounce">防抖</button>
<button id="throttle">节流</button>
<script>
  let btn_debounce = document.getElementById('debounce')
  let btn_throttle = document.getElementById('throttle')

  // 防抖
  function debounce(fn, delay = 500) {
    let timer
    return () => {
      if (timer) clearTimeout(timer)
      timer = setTimeout(() => {
        fn.apply(this, arguments)
      }, delay)
    }
  }

  // 节流
  function throttle(fn, delay = 500) {
    let timer
    return () => {
      if (timer) {
        return
      }
      timer = setTimeout(() => {
        fn.apply(this, arguments)
        timer = null
      }, delay)
    }
  }

  // 注册防抖
  btn_debounce.onclick = debounce(() => {
    console.log('多次点击只会执行一次!')
  }, 1000)

  // 注册节流
  btn_throttle.onclick = throttle(() => {
    console.log('一段时间内点击只会执行一次!')
  }, 1000)
</script>

Released under the MIT License.