对于触发很是频繁又没有必要每次都执行的事件,但愿合并到一次去执行;javascript
实现思路:java
事件触发后,在规定的时间范围内若是事件重复触发,那么忽略以前触发的事件,而且从新开始计时,直到某一次事件触发后大于规定时间,咱们才执行须要执行的代码段(函数);闭包
看起来就像是只执行了用户快速操做的最后一次事件;app
var debounce = function(fn, delayTime) { var timeId; return function() { var context = this, args = arguments; timeId && clearTimeout(timeout); timeId = setTimeout(function{ fn.apply(context, args); }, delayTime) } }
利用闭包保存一个setTimeout的id,若是在delayTime内闭包中的函数再次执行,会马上clear掉上一次的延时回调,生成一个新的延时回调;若是超过delayTime没有再次执行闭包中的函数,那延时回调就会被执行,这样才算是真正执行了须要执行的事件。函数
对于触发很是频繁的事件,在规定时间间隔后才能执行,在规定时间间隔内触发的事件会被忽略,可是不会从新开始计时;post
规定一个时间,一次触发后,在规定时间内触发的事件都忽略,超过规定时间后能够从新执行触发的事件;this
var throttle = (fn, delayTime) => { var _start = Date.now(); return function() { var _now = Date.now(), context = this, args = arguments; if(_now - _start >= delayTime) { fn.apply(context, args); _start = Date.now(); } } }
先设定一个初始时间,而后每次执行闭包内的函数都与当前时间作比较,若是小于delayTime,什么也不作,忽略该次事件,若是大于delayTime,执行回调函数fn,重置初始时间;code
var throttle = function(fn, delayTime) { var flag; return function() { var context = this, args = arguments; if(!flag) { fn.apply(context, args); flag = setTimeout(function() { flag = false; }, delayTime); } } }
经过设定一个标志位,经过标志位判断是否能够执行回调函数,在延时函数中执行回调的同时将标志位置为可再次执行,这样就保证了在规定时间以后能再次执行须要的回调函数;游戏
参考:事件