您好!欢迎来到聚码网

聚码网

热门搜索: 相亲小程序    搭子源码    直播系统自有商城   
  • 关于函数节流,定时器里的fn.applay()感觉好诡异?
  • 聚码交流
  • 0 0
  • yhuxAvNbtxUM
    0000-00-00 00:00:00
  • 回帖
代码不复杂,逻辑很简单,就是函数节流,我直接放代码了。varcount=0setInterval(()=>console.log(newDate().getSeconds()),1000)functiondoSomthing(){console.log('懵逼。。。。')count++;}window.onresize=throttle(doSomthing,1000)functionthrottle(fn,threshhold){//记录上次执行的时间varlast//定时器vartimer//默认间隔为250msthreshhold||(threshhold=250)//返回的函数,每过threshhold毫秒就执行一次fn函数returnfunction(){//保存函数调用时的上下文和参数,传递给fnvarcontext=thisvarargs=argumentsvarnow=+newDate()//如果距离上次执行fn函数的时间小于threshhold,那么就放弃//执行fn,并重新计时if(last&&now<last+threshhold){clearTimeout(timer)//保证在当前时间区间结束后,再执行一次fntimer=setTimeout(function(){last=nowconsole.log('第'+count+'次执行')fn.apply(context,args)},threshhold)//在时间区间的最开始和到达指定间隔的时候执行一次fn}else{last=nowfn.apply(context,args)}}}理论上当我不断改变浏览器窗口大小的时候(就是说间隔肯定小于1s的),doSomthing从第二次开始是不会被执行的。因为我在不断的执行cleraTimeout,实际运行结果是console.log('第'+count+'次执行)确实没有被打印出来,但是当我停止改变浏览器窗口的时候,发现打印出来的count并不是1,而且是一个很大的数。这说明,在这段代码里:timer=setTimeout(function(){last=nowconsole.log('第'+count+'次执行')fn.apply(context,args)},threshhold)`setTimeout()里的匿名函数没有被执行,但是匿名函数里的fn.apply()却被执行了,求大神告知原理何在啊?还是我这段代码本身有问题?
最近热帖
近期热议
联系我们
Q Q:317563994
电话:400-000-000
邮箱:317563994@qq.com
时间:09:00 - 17:00