防抖 & 节流

# 防抖 & 节流

# 防抖

# 什么是防抖?

  • 当事件触发时,相应的函数不会被立即触发,而是会被推迟执行
  • 当事件被频繁触发的时候,函数的触发延迟一段时间
  • 简而言之,防抖就是将函数的执行延迟一定时间,如果在该时间内重新触发事件,那么延迟的时间会重置,只有真正达到延迟时间,才会执行回调函数
  • 举个例子:游戏中的回城就可以认为是防抖,在回城的读秒过程中,如果再次执行回城操作,那么会重新进行读秒,只有整个读秒过程都没有再次执行回城操作,那么等到读秒结束才能成功回城

# 场景

  • 输入框频繁输入内容,搜索或者提交信息
  • 频繁点击按钮,触发某个事件
  • 监听浏览器滚动事件
  • 监听用户缩放浏览器resize事件

# 实现防抖函数

function debounce(fn,delay = 300){
  let timer = null
  return function(...arg){
    //第一次点击的时候timer是不存在的
    //第二次点击的时候timer已经又值了,这时候我们就需要清空这个定时器,不让它触发出来
    if(timer){
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      fn.apply(this,arg)
    }, delay);
  }
}

# 节流

# 什么是节流?

  • 节流是指当事件触发时,会执行这个事件的响应函数
  • 但是该事件如果被频繁触发,那么节流函数会按照一定的频率来执行函数。
  • 节流类似于技能cd,不管你按了多少次,必须等到cd结束后才能释放技能。也就是说在如果在cd时间段,不管你触发了几次事件,只会执行一次。只有当下一次cd转换,才会再次执行。

# 代码实现

function throttle(fn,daley=300) {
  let last = 0
  return function (...args) {
    const now = Date.now()
    if(now - last > daley){//对比一下上次触发函数的时间 和本次触发的间隔 有没有超过规定的时间戳
      last = now
      fn.apply(this,args)
    }
  }
}

上次更新: 12 天前