JS--防抖和节流

91 阅读1分钟

防抖和节流都是为了减少高频事件回调函数的执行次数、提高性能。

1. 防抖函数

触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间。

  function debounce(fn, time) {
    // @fn{function} 需要防抖的函数
    // @time{number}毫秒,重置时间
    // @return{undefined}
    
    let timeout = null
    return function () {
      clearTimeout(timeout)
      timeout = setTimeout(() => {
        fn.apply(this, arguments)
      }, time)
    }
  } 

2. 节流函数

高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率.

  function throttle(fn, time) {
    // @fn{function}需要执行的函数
    // @time{number}函数执行最小间隔毫秒数
    // @return{undefined}

    let canRun = true
    return function () {
      if (!canRun) {
        return
      }
      canRun = false
      setTimeout(() => {
        fn.apply(this, arguments)
        canRun = true
      }, time)
    }
  }

3. 用法示例

function sayHi() {
    console.log('Hi')
  }

  // 页面上一个输入框,不论输入的频率如何,都只会在输入结束后 500 毫秒内没有再次输入的情况下打印结果
  document.getElementById("ipt").addEventListener("input", debounce(sayHi, 500))

  // 页面上一个输入框,输入事件触发后 1 秒内最多打印一次
  document.getElementById("ipt").addEventListener("input", throttle(sayHi, 1000))