函数的防抖和节流

147 阅读1分钟

闭包进阶 —— 函数的防抖和节流

函数的防抖:

触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间


/**
 * @param {*} func[function] 执行的函数
 * @param {*} wait[number] 间隔多少后秒视为有效点击 默认0.3秒
 * @param {*} immediate[boolean] 控制是否执行 
 *   为true立即执行(频繁操作中第一次点击视为有效点击) 
 *   默认false(频繁操作中最后一次点击有效)(即立即执行和非立即执行)
 */

function debounce(func, wait = 300, immediate = false) {
  let timer = null
  return function (...params) {
    let now = immediate && !timer
    clearTimeout(timer)
    timer = setTimeout(() => {
      timer = null
      !immediate ? func.call(this, ...params) : null
    }, wait)
    now ? func.call(this, ...params) : null
  }
}

函数节流:

指连续触发事件但是在 n 秒中只执行一次函数 节流会降低函数的执行频率


/**
 * @param {*} func[function] 执行的函数
 * @param {*} wait[number] 间隔多少后秒视为有效点击 默认0.3秒
 */

function throttle(func, wait = 300) {
  let timer = null
  let previous = 0 // 记录上次操作时间
  return function (...params) {
    let now = new Date()
    let remaining = wait - (now - previous) // 距离上次操作的间隔时间
    if (remaining <= 0) {
      // 两次操作间隔时间已经超过wait
      window.clearTimeout(timer)
      previous = now
      func.call(this, ...params)
    } else if (!timer) {
      // 两次操作间隔时间小于wait
      timer = setTimeout(() => {
        timer = null
        previous = new Date()
        func.call(this, ...params)
      }, remaining)
    }
  }
}