关于防抖和节流

在性能优化篇提到了防抖和节流,具体的区别已经知道了,打算手写代码

防抖

function debounce(fn,wait=500){
        let timer;
        return (...args)=>{
            if(timer){
                clearTimeout(timer)
            }
            timer = setTimeout(()=>{
                fn.apply(this,args)
            },wait)
        }
    }

节流(为什么settimeout不用清除,flag的一波操作没看懂,去看一下eventloop)

定时器:

定时器的优缺点与时间戳相反,当时发事件后1秒钟,执行处理函数,在事件间隔内出发时间,等超过时间间隔会再次执行处理函数

 function throttle(fn,wait=1500) {
         let flag=true;
         return (...args)=>{
             if(!flag){
                 return
             }
                 flag=false
                 setTimeout(()=>{
                     fn.apply(this,args)
                     flag=true
                 },wait)
         }
        
    }

时间戳:

时间戳的一个优点:在页面初始化的时候就生成了“初始时间”(不明白初始时间上面有提示),而此时还没有触发scroll时间,等触发时远远超过了时间间隔(假设时间间隔为1秒),所以处理函数会立即执行

时间戳的一个缺点:假设触发事件的间隔是一秒,在距离上一次触发事件的时间还差0.5秒停止触发事件,那一秒过后事件函数也不会执行;

 function throttle(fn,time){
        let lastTime=0
        return function(){
            let now=new Date()
            if(now-lastTime>time){
                fn.apply(this,arguments);
                lastTime=now
            }
        }
    }

结合之后:

 function throttle(func, delay) {
  var timer = "";
  var startTime = Date.now();
  return function() {
    var curTime = Date.now();
    var remaining = delay - (curTime - startTime);
    var context = this;
    var args = arguments;
    clearTimeout(timer);
    if (remaining <= 0) {
      func.apply(context, args);
      startTime = Date.now();
    } else {
      timer = setTimeout(func, remaining);
    }
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值