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
varthrottle=function(fn,delay,mustRun){vartimer;varnow;varprevious;returnfunction(){now=+newDate();varcontext=this;if(!previous){previous=now}vardelta=now-previous;if(mustRun&&delta>=mustRun){fn.apply(context,arguments);previous=now;}else{window.clearTimeout(timer);timer=setTimeout(function(){console.log("This is delay!");fn.apply(context,arguments);},delay);}};}vartime=+newDate();functionfn(){console.log("Window Scroll at:"+(+newDate()-time));}window.onscroll=throttle(fn,2000,5000);
javascript 函数节流 是一种提升函数执行性能的方法。
问题来源:
如果一个函数在短时间内被频繁调用,比如说 scroll, mousemove, click等事件的回调函数,最终会挤满js的回调函数队列。
因此就会造成性能问题或者重复的ajax请求。
解决思路:
采用setTimeout定时器的方法,每次调用的时候,会清除已经存在的定时器,并建立一个新的定时器覆盖原来的,从而使函数执行时间重置。
如果一直触发这个函数,函数的执行期就会无限拖延,除非停止触发。停止触发之后,函数才会在setTimeout规定的delay之后得以执行。
例一
下面是一个按钮点击的例子:
上述例子在执行的时候,我们可以连续多次的点击按钮,都不会执行fn函数,只有当我们停止点击一段时间(这里是1s)后,fn才最终执行
输出clicked!
例二
有时候我们有这样的需求:既不想频繁的调用函数,又想要这个函数在一定时间内定期执行一次,该怎么做呢,我们可以采用一个mustRun变量,
当定时器经过了mustRun规定的时间时,就必须调用这个函数,代码如下:
上述例子中,我们不断滚动浏览器窗口,则fn函数在5s内必定执行一次,当我们停止滚动,fn在经过2s的延迟后又会执行一次。
总结
JS 函数节流是一种行之有效的性能改善方法,从而改善交互体验。
The text was updated successfully, but these errors were encountered: