防抖函数和节流函数

8 阅读1分钟

防抖函数(简单版本)

/**
   * 防抖(Debounce):
   * 在事件被触发后,延迟 n 秒后才执行回调函数。
   * 如果在这 n 秒内又被触发,则重新计时。
   * 
   * 应用场景:
   * - 搜索框输入:用户停止输入后才发送请求
   * - 窗口 resize:窗口调整完成后才执行计算
   * - 按钮点击:防止用户快速多次点击提交
   * 
   * 效果:确保函数在连续触发事件结束后只执行一次
   */
const debounce = <T extends (...args: any[]) => any>(func: T, delay: number) => {
    let timeoutId: NodeJS.Timeout | null = null
    return (...args: Parameters<T>) => {
      if (timeoutId) {
        clearTimeout(timeoutId)
      }
      timeoutId = setTimeout(() => {
        func(...args)
      }, delay)
    }
  }

节流函数(简单版本)

 /**
   * 节流(Throttle):
   * 在一定时间内,无论事件触发多少次,函数只执行一次。
   * 即在指定时间间隔内,函数最多执行一次。
   *
   * 应用场景:
   * - 滚动事件:页面滚动时限制处理频率
   * - 鼠标移动:限制 mousemove 事件处理频率
   * - 按钮点击:防止短时间内重复提交
   * - 窗口 resize:限制调整窗口时的计算频率
   *
   * 效果:确保函数在持续触发事件期间按固定时间间隔执行
   *
   * 与防抖的区别:
   * - 防抖:事件停止触发后才执行(最后一次)
   * - 节流:事件持续触发时按间隔执行(多次)
   */
   const throttle = <T extends (...args: any[]) => any>(func: T, delay: number) => {
    let lastTime = 0
    return (...args: Parameters<T>) => {
      const now = Date.now()
      if (now - lastTime >= delay) {
        lastTime = now
        func(...args)
      }
    }
  }