Skip to content

防抖与节流 ​

1.防抖 ​

事件触发后,等一段时间,如果这段时间内没有再触发,才执行一次。如果期间又触发了,重新计时。

场景 ​

  • 搜索框输入:用户打字时不断触发,只在停下来之后才发请求
  • 窗口 resize:拖动窗口大小时不断触发,只在停下来之后才重新布局
  • 表单验证:用户输入时先不校验,停止输入后再检查
js
//给fn加上防抖
function debounce(fn, delay) {
  let timer = null
  return function (...args) {
    clearTimeout(timer)  // 每次触发都清掉上一个定时器
    timer = setTimeout(() => {   // 重新计时
      fn.apply(this, args)
    }, delay)
  }
}

2.节流 ​

在一段时间内,最多只执行一次。不管触发多少次,都按固定频率执行。

场景 ​

  • 滚动加载:滚动时按固定频率检查位置,不用每滚一像素就检查
  • 鼠标移动:按固定频率更新位置
  • 按钮点击:防止用户狂点,规定时间内只响应一次
js
function throttle(fn, delay) {
  let last = 0
  return function (...args) {
    const now = Date.now()
    if (now - last >= delay) {   // 距离上次执行超过 delay 才执行
      last = now
      fn.apply(this, args)
    }
  }
}

3.两者的区别 ​

对比项防抖(Debounce)节流(Throttle)
执行时机停止触发后执行一次固定间隔执行
执行次数只执行最后一次按频率执行多次
核心逻辑重新计时控制频率
类比电梯等人,没人再进才关门红绿灯,固定时间放行一次
适用场景只关心最终结果需要持续响应

Code. Log. Share.