underscoredebounce函数分析标记(空格分隔):underscore本文是underscore源码分析系列文章的第六篇。在上一节中,我们介绍了油门功能的实现。本节将介绍油门功能。兄弟——debounce防抖功能。油门功能触发频率高。为了防止频繁调用函数,限制在一段时间内只能调用一次。debounce函数在频繁触发的情况下,只在最后一次触发时调用一次。想象一下,如果我们用手握住一个弹簧,直到我们松开把手,弹簧才会弹起来。接下来,我用一个Theelevatorexample来介绍debounce功能。电梯如果我下班坐电梯,等了一会儿,电梯就要关门下去了。这时候有同事走过来,电梯门打开了,所以电梯还要继续等一会儿。如果中间有人进来,那么电梯要等到最后一个人进来一定时间后电梯才会下行,直到下一个人进来电梯才会下行。应用场景另外对于电梯,我们其实有很多应用场景。比如我用键盘连续输入文字。希望在最后一次输入后调用该接口请求显示关联词。调用接口,所以调用太频繁了。没有debounce时:有debounce时:simpledebounce知道了debounce的原理之后,我们可以先自己实现一个比较简单的debounce函数。functiondebounce(func,wait){vartimeout,args,contextvarlater=function(){func.apply(context,args)timeout=context=args=null}returnfunction(){context=thisargs=arguments//每次触发都会清空之前的定时器clearTimeout(timeout)//只有在最后一次触发之后才会调用后面的timeout=setTimeout(later,wait)}}麻雀虽小,五脏俱全,但是这个函数还是有很多问题,比如为每个trigger设置太多的setTimeouts,会消耗更多的cpu。我们来看看下划线的实现。underscoredebounce//debounce函数传入三个参数,分别是要执行的函数func,延迟时间wait,是否执行immediate//如果immediate为true,那么func会在等待时间开始时执行一次period,然后不管触发多少次,func都不会再执行//在不小心点了两次提交按钮,两次提交的情况下很有用_.debounce=function(func,wait,immediate){var超时、参数、上下文、时间戳、结果;varlater=function(){//这是最关键的一步,因为每次触发都要记录当前时间戳//但later是在第一次触发后的等待时间后执行的,_now()减去when的时间第一个trigger当然等于wait//但如果后面的trigger继续,那么_.now()-timestamp肯定会小于wait//last是后面执行时间和最后一个trigger的时间差varlast=_.now()-时间戳;//如果在稍后执行之前还有其他触发器,定时器将被重置//last>=0应该防止客户端系统时间被调整if(last
