Underscore 源码学习(五)
Underscore 的函数大部分还是挺好理解的,感觉过一遍就行了,不过今天看到两个函数感觉还是挺有意思的,并且也挺常用。这两个函数就是 throttle 和 debounce。
throttle
|
|
其实一步步去理解也不难,就不细说这个方法了。这个方法有可选项设置,分别为 {leading: false} 和 {trailing: false}。
所以一般有四类情况:
- 默认情况
第一次调用时立即响应,之后每个周期内最多执行一次,周期内触发会产生定时执行使在上一次执行时间preview
周期时间后再次执行。 - 设置
leading
为false
同默认情况区别在于第一次调用不会立即执行而是等待周期时间后再次执行,如果在周期时间内触发,一样等待上一次执行时间preview
周期时间后再执行。 - 设置
trailing
为false
最后周期内最多执行一次,但在周期时间内调用不会触发timeout
,只能在上一次timeout
失效后调用才能生效并且此时调用将立即执行。 - 设置
leading
和trailing
为false
如果同时还设置leading
为false
的话,那么第一次调用不会立即执行而是等待周期时间后才执行,在这段时间内调用都不会有效果。
比如12var func = _.throttle(updatePosition, 100);$(window).scroll(func);
由于 scroll 过程时, func
函数的调用是很密集的,我们不能每次调用都去执行,可以通过设置 throttle 来达到节流阀的作用。leading
和 trailing
只是实现上细微的不同而已。
throll 主要应用在鼠标移动,mousemove 事件,DOM 元素动态定位,window 对象的 resize 和 scroll 等事件。这些事件触发频率高,但又要尽可能进行响应。
debounce
|
|
这个函数就要比上面那个好理解一点,说明下这个函数:
如果
immediate
为true
,周期 100ms- 0 => 立即执行,设置
timeout
- 50 => 重新设置
timeout
,不执行 - 100 => 重新设置
timeout
,不执行 - 200 =>
timeout
到时,执行函数
- 0 => 立即执行,设置
如果
immediate
为false
, 周期 100ms- 0 => 设置
timeout
,不执行 - 100 =>
timeout
到时,执行函数 - 120 => 设置
timeout
,不执行 - 180 => 重新设置
timeout
,不执行 - 280 =>
timeout
到时,执行函数
- 0 => 设置
其实 timeout
就变成一个控制两次事件触发间隔用的,并且和上面的 throttle 不同,timeout
会被重新设置。
debounce 主要应用在文本输入 keydown 事件,keyup 事件,例如做 autocomplete。
结合两个的应用细细体味下他们差别。如果想自己体验下差别,传送门。