在開發中,咱們經常會去監聽滾動事件或者用戶輸入框驗證事件,若是事件處理沒有頻率限制,就會加劇瀏覽器的負擔,影響用戶的體驗感,瀏覽器
所以,咱們能夠採起防抖(debounce)和節流(throttle)來處理,減小調用事件的頻率,達到較好的用戶體驗。緩存
防抖(debounce):閉包
function debounce(fn, wait) { var timeout = null;// 使用閉包,緩存變量
return function() {
if(timeout !== null) { console.log('清除定時器啦') clearTimeout(timeout); //清除這個定時器 } timeout = setTimeout(fn, wait); } } // 處理函數 function handle() { console.log(Math.random()); } var container = document.getElementById('container') container.addEventListener('scroll', debounce(handle, 1000));
咱們能夠發現,當連續觸發scroll事件,handle函數只會在1秒時間內執行一次,在若是繼續滾動執行,就會清除定時器,從新計時。至關於就是屢次執行,只執行一次。app
節流(throttle):dom
var throttle = function(func, delay) { var timer = null; // 使用閉包,緩存變量 var prev = Date.now(); // 最開始進入滾動的時間 return function() { var context = this; // this指向window var args = arguments; var now = Date.now(); var remain = delay - (now - prev); // 剩餘時間 clearTimeout(timer); // 若是剩餘時間小於0,就馬上執行 if (remain <= 0) { func.apply(context, args); prev = Date.now(); } else { timer = setTimeout(func, remain); } } } function handle() { console.log(Math.random()); } var container = document.getElementById('container') container.addEventListener('scroll', throttle(handle, 1000));
在節流函數內部使用開始時間prev、當前時間now和剩餘時間remain,當剩餘時間小於等於0意味着執行處理函數,這樣保證第一次就能當即執行函數而且每隔delay時間執行一次;函數
若是還沒到時間,就會在remaining以後觸發,保證最後一次觸發事件也能執行函數,若是在remaining時間內又觸發了滾動事件,那麼會取消當前的計數器並計算出新的remaing時間。ui
經過時間戳和定時器的方法,咱們實現了第一次當即執行,最後一次也執行,規定時間間隔執行的效果。this
總結,看完了防抖和節流的分別介紹,咱們來看看他們的區別:spa
防抖是將屢次執行變爲只執行一次,節流是將屢次執行變爲每隔一段時間執行。3d
防抖(debounce)
search搜索聯想,用戶在不斷輸入值時,用防抖來節約請求資源。
window觸發resize的時候,不斷的調整瀏覽器窗口大小會不斷的觸發這個事件,用防抖來讓其只觸發一次
節流(throttle)
鼠標不斷點擊觸發,mousedown(單位時間內只觸發一次)
監聽滾動事件,好比是否滑到底部自動加載更多,用throttle來判斷
本文轉載多出,爲了讓本身看得明白一點。