charleyup

为自己吹过的🐮🍺奋斗终生.

防抖与节流

2020/01/25

防抖

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

使用场景:点击按钮调用接口、监听输入框change事件等。

const debounce = function (fn, wait) {
  let timer = null
  return function () {
    clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, arguments)
    }, wait)
  }
}

节流

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

使用场景:页面滚动的回调事件等。

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