防抖、节流
2018-04-25 11:38
337 查看
防抖(debounce)
作用是在短时间内多次触发同一个函数,只执行最后一次,或者只在开始时执行。以用户拖拽改变窗口大小,触发
这时候可以使用函数防抖来优化相关操作:
2 3 4 | window.addEventListener('resize',()=>{ console.log('trigger'); }) |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | functiondebounce(fn,delay){ //维护一个timer lettimer=null; returnfunction(){ //获取函数的作用域和变量 letcontext=this; letargs=arguments; clearTimeout(timer); timer=setTimeout(function(){ fn.apply(context,args); },delay) } } |
2 3 4 5 6 | console.log('trigger'); } //在debounce中包装我们的函数,过2秒触发一次 window.addEventListener('resize',debounce(foo,2000)); |
每一次事件被触发,都会清除当前的
只有在最后一次触发事件,才能在
我们也可以为
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | vartimer=null; returnfunction(){ varcontext=this; varargs=arguments; if(timer)clearTimeout(timer); if(immediate){ vardoNow=!timer; timer=setTimeout(function(){ timer=null; },delay); if(doNow){ func.apply(context,args); } }else{ timer=setTimeout(function(){ func.apply(context,args); },delay); } } } |
节流(throttle)
类似于防抖,节流是在一段时间内只允许函数执行一次。应用场景如:输入框的联想,可以限定用户在输入时,只在每两秒钟响应一次联想。
可通过时间戳和定时器来实现。
时间戳实现:
2 3 4 5 6 7 8 9 10 11 12 | varprev=Date.now(); returnfunction(){ varcontext=this; varargs=arguments; varnow=Date.now(); if(now-prev>=delay){ func.apply(context,args); prev=Date.now(); } } } |
2 3 4 5 6 7 8 9 10 11 12 13 14 | vartimer=null; returnfunction(){ varcontext=this; varargs=arguments; if(!timer){ timer=setTimeout(function(){ func.apply(context,args); timer=null; },delay); } } } |