Skip to content

函数防抖与节流

函数防抖与节流其实是比较相似的概念,都是为了限制高频动作场景下的事件触发,但是两者的应用场景又有些差别。

防抖

防抖的重点是在用户持续动作时不会执行事件,直到用户停止动作才会去触发事件。常见的场景有:输入框搜索、输入校验、点击提交等等

实现方法

js
/**
 * @method debounce 防抖
 * @param {function} method 所需执行的函数
 * @param {number} delay 延迟时间: 时间戳 毫秒
 * @return {function} 包装器处理后的函数
 */
export function debounce(method, delay) {
  return function(...args) {
    let that = this
    clearTimeout(method.timer)
    method.timer = setTimeout(() => {
      method.apply(that, args)
    }, delay)
  }
}

节流

节流的重点是让用户的方法每隔一段时间只执行一次,而不是像防抖一样直接终止用户的方法执行。常见的场景有:mousemove、resize、scroll等等

实现方法

js
/**
 * @method throttle 节流
 * @param {function} method 所需执行的函数
 * @param {number} delay 延迟时间: 时间戳 毫秒
 * @return {function} 包装器处理后的函数
 */
export function throttle(method, delay) {
  let lastTime
  let timer
  return function(...args) {
    let that = this
    let nowTime = Date.now()
    clearTimeout(timer) // 总是清除事件回调
    if (lastTime && nowTime - lastTime < delay) {
      // 让方法在脱离事件后也能执行一次
      timer = setTimeout(() => {
        method.apply(that, args)
      }, delay)
    } else {
      lastTime = nowTime
      method.apply(that, args)
    }
  }
}

Updated at: