什麼是防抖和節流?手寫一個防抖函式和節流函式?
阿新 • • 發佈:2020-12-17
1.防抖(debounce)
當持續觸發事件時,一定時間段內沒有再觸發事件,事件處理函式才會執行一次,如果設定的時間到來之前,又一次觸發了事件,就重新開始延時。
當你頻繁觸發後,n秒內只執行一次。
function test() {
console.log('防抖')
}
window.addEventListener('mousemove', debounce(test, 1000));
function debounce(func, wait) {//核心程式碼
var timer,
wait = +wait || 0;
return function () {
var context = this
var args = arguments
timer ? clearTimeout(timer) : func.apply(context, args);
timer = setTimeout(function () {
func.apply(context, args)
}, wait);
}
}
2.節流(throttle)
當持續觸發事件時,保證一定時間段內只調用一次事件處理函式。
在固定的時間內觸發事件,每隔n秒觸發一次
function throttle(func, wait) { //核心程式碼
var timer,
wait = +wait || 0;
return function () {
var context = this;
var args = arguments;
if (!timer) {
func.apply(context, args)
timer = setTimeout(function () {
timer = null;
}, wait)
}
}
}
應用場景:
搜尋框搜尋時,使用者在不斷輸入值時,用防抖來節約請求資源。
頻繁操作點贊和取消點贊,因此需要獲取最後一次操作結果併發送給伺服器
登入按鈕或者其他什麼按鈕,使用者滑鼠不斷點選觸發,mousedown(單位時間內只觸發一次)
window觸發resize的時候,不斷的調整瀏覽器視窗大小會不斷的觸發這個事件,用防抖來讓其只觸發一次