防抖动和节流函数原理和差别

为什么需要

当监听的事件被高频率触发时(比如滚动),绑定的处理函数相应也高频率执行多次,这会大大降低性能。
这时就需要设置防抖动或节流

防抖动

设置一个时间间隔delay,当事件触发后,经过了delay时间,下次的还未触发,才会执行;
若事件触发后,delay时间内又触发了一次,就不会执行。
直接上代码:

function debounce(func, delay) {
  // 防抖动函数,下次执行前等待时间大于等于delay时func才被执行
  // 持久化timer变量
  let timer = null;
  return function (...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  }
}

在频繁事件中调用debounce返回的函数实现防抖。

原理

timer能一直被访问(闭包),第一次执行,设置定时器,delay时间过后执行,如果过了delay时间未被二次执行,func就得以调用;
如果在delay时间内又被执行,则会清除掉timer定时器,并且重新开个定时器,相当于重置了时间。

节流

这次触发与上次触发时间间隔大于设置的值时,就会执行。

function throttle(fn,gapTime){
  let _lastTime = 0;
  return function(...args){
    let _nowTime = +new Date() // 快速转为时间戳
    if(_nowTime - _lastTime > gapTime){
      fn.apply(this,args)
      _lastTime = _nowTime
    }
  }
}
差别

防抖动函数最后触发的那次总会执行,因为过了delay时间内没有下次的触发来充值定时器。
而节流最后触发的那次只有与上次时间间隔大于设置的时间才会被执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值