防抖动:将几次操作合并为一此操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。
节流:使得一定时间内只触发一次函数。它和防抖动最大的区别就是,节流函数不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而防抖动只是在最后一次事件后才触发一次函数。原理是通过判断是否到达一定时间来触发函数,若没到规定时间则使用计时器延后,而下一次事件则会重新设定计时器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
debouce(func,delay,immediate){ var timer = null; return function(){ var context = this; var args = arguments; if(timer) clearTimeout(timer); if(immediate){ var doNow = !timer; timer = setTimeout(function(){ timer = null; },delay); if(doNow){ func.apply(context,args); } }else{ timer = setTimeout(function(){ func.apply(context,args); },delay); } } }
public static debounce(fn: Function, delay: number, immediate: boolean = false, defaultReturn = null): any { let timer = null; let status = true; if (immediate) { return function (...args: any[]) { clearTimeout(timer); timer = setTimeout(() => status = true, delay); if (status) { status = false; return fn.call(this, ...args); } else { return defaultReturn } } } else { return function (...args: any[]) { if (timer) clearTimeout(timer) timer = setTimeout(() => fn.call(this, ...args), delay) } } }
|