對於觸發很是頻繁又沒有必要每次都執行的事件,但願合併到一次去執行;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); } } }
經過設定一個標誌位,經過標誌位判斷是否能夠執行回調函數,在延時函數中執行回調的同時將標誌位置爲可再次執行,這樣就保證了在規定時間以後能再次執行須要的回調函數;遊戲
參考:事件