You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Returns a function, that, when invoked, will only be triggered at most once// during a given window of time. Normally, the throttled function will run// as much as it can, without ever going more than once per `wait` duration;// but if you'd like to disable the execution on the leading edge, pass// `{leading: false}`. To disable execution on the trailing edge, ditto._.throttle=function(func,wait,options){// 初始化声明缓存变量,利用了闭包变量不销毁的原理,始终保持在内存中// 为了防止内存泄漏,执行完成后一要将变量置为nullvartimeout,context,args,result;varprevious=0;if(!options)options={};varlater=function(){// 初次回调不执行将previous = 0,也就是previous = nowprevious=options.leading===false ? 0 : _.now();timeout=null;result=func.apply(context,args);if(!timeout)context=args=null;};varthrottled=function(){// 事件回调时间varnow=_.now();// 判断初次回调 是否关闭if(!previous&&options.leading===false)previous=now;// 执行下次回调需要等待的时间// 1.如果初次不回调,则remaining === wait,也就是previous = now// 2.初次回调 remaining < 0// 3.手动调整客户端的时间后,remaining > waitvarremaining=wait-(now-previous);context=this;args=arguments;if(remaining<=0||remaining>wait){// 初次回调执行// 此处的timeout可能有值// 是上一次回调的timeoutif(timeout){clearTimeout(timeout);timeout=null;}// 记录回调执行的时间previous=now;result=func.apply(context,args);// 手动置为nullif(!timeout)context=args=null;}elseif(!timeout&&options.trailing!==false){// 如果已经存在一个定时器,则不会进入该 if 分支// 初次回调不执行// 末尾回调执行timeout=setTimeout(later,remaining);}returnresult;};throttled.cancel=function(){clearTimeout(timeout);previous=0;timeout=context=args=null;};returnthrottled;}window.addEventListener('resize',_.throttle(cl,2000))
Throttle
概念
事件节流是指控制事件在一段时间内只执行一次,比如window的
resize
/scroll
,还比如mousemove
,touhchmove
,还有输入框的input
/change
,当然输入框的更适合防抖debounce
去做。简单实现
throttle的实现方式
setTimeout定时器简单实现的问题
underscore实现方式
虽然定时器不能实现节流,但是可以配合方法1来更好的解决上述的问题。
underscore的节流可以控制头尾的回调是否执行,也就是第三个参数options
让我们来逐行分析它是如何结合2者的(以下为拷贝的underscore源码)
总结
underscore的节流函数考虑到了很多方面:
首尾回调可传参控制
一定时间间隔内只会触发回调一次,且间隔的时间是动态计算的,也就是说定时器的时间是动态的。上面写的方法2中说的定时器实现不了的问题,hold住不放,定时器会从头计算等待的时间,再开始触发回调
计算时间差与定时器来解决的好处就是可以动态赋值定时器的remaining time,这也是二者结合的最根本。
参考
underscore 函数节流的实现
JS魔法堂:函数节流(throttle)与函数去抖(debounce)
The text was updated successfully, but these errors were encountered: