防抖和节流

防抖概念:

当持续触发事件时,设定的时间段内没有再触发事件,事件处理函数(回调函数)才会执行一次,如果设定的时间段内,再次触发事件,则重新开始计时

典型场景:输入框输入关键词触发搜索

关键点:

1、每次触发事件都会执行防抖函数

2、每次触发事件不一定执行回调函数(业务处理函数)

3、回调函数(业务处理函数)的执行条件:事件触发防抖函数执行,触发时间间隔 >= 指定时间

代码实现(闭包函数):

 //业务处理函数
  function cb() {
    console.log('业务处理函数执行了', Math.random())
  }

 //防抖函数--使用闭包函数
 function debounce(cb, ms) {
    //setTimeout 返回的id值
    let timer = null
    return function () {
      console.log('防抖函数执行,清除旧的', timer)
      //清除上一次的定时器
      clearTimeout(timer)
      timer = setTimeout(() => cb(), ms)
      console.log('防抖函数执行,生成新的', timer)
    }
  }
  const fangdou = debounce(cb, 1000)
  // console.dir(fangdou)
  window.addEventListener('scroll', fangdou)

节流概念:

当持续触发事件时,保证一定时间段内只调用一次事件处理函数

节流通俗解释就比如我们水龙头放水,不让水一直流动,而是把水龙头关小点,按照一定规律在某个时间间隔内一滴一滴的往下滴。

应用场景:

1、 鼠标连续不断地触发某事件(如点击),只在一定时间段内只触发一次。

2、比如懒加载时要监听计算滚动条的位置。

代码实现(闭包函数):

 //业务处理函数
  function cb() {
    console.log('业务处理函数执行了', Math.random())
  }
  //节流函数--使用闭包函数
  function throttle(cb, delay) {
    let valid = true //此次触发是否有效
    return function () {
      //valid 不满足条件执行 return false
      if (!valid) {
        return false// 工作时间,执行函数并且在间隔期内把状态位设为无效
      }
      valid = false // 工作时间,执行函数并且在间隔期内把状态位设为无效
      setTimeout(() => {
        cb() //执行业务处理函数
        valid = true  // 此次执行完毕,准备下次执行
      }, delay)
    }
  }
  const jieliu = throttle(cb, 1000)
  window.addEventListener('scroll', jieliu)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值