函數(shù)防抖(debounce):觸發(fā)高頻事件后n秒內(nèi)函數(shù)只會執(zhí)行一次,如果n秒內(nèi)高頻事件再次被觸發(fā),則重新計算時間。
函數(shù)節(jié)流(throttle):高頻事件觸發(fā),但在n秒內(nèi)只會執(zhí)行一次,所以節(jié)流會稀釋函數(shù)的執(zhí)行頻率。
函數(shù)節(jié)流(throttle)與 函數(shù)防抖(debounce)都是為了限制函數(shù)的執(zhí)行頻次,以優(yōu)化函數(shù)觸發(fā)頻率過高導致的響應速度跟不上觸發(fā)頻率,出現(xiàn)延遲,假死或卡頓的現(xiàn)象。
1、防抖(debounce)
實現(xiàn)方式:每次觸發(fā)事件時設置一個延遲調(diào)用方法,并且取消之前的延時調(diào)用方法
缺點:如果事件在規(guī)定的時間間隔內(nèi)被不斷的觸發(fā),則調(diào)用方法會被不斷的延遲
2、節(jié)流(throttle)
實現(xiàn)方式:每次觸發(fā)事件時,如果當前有等待執(zhí)行的延時函數(shù),則直接return
**防抖:將多次操作合并為一次操作進行。原理是維護一個計時器,規(guī)定在delay時間后觸發(fā)函數(shù),但是在delay時間內(nèi)再次觸發(fā)的話,就會取消之前的計時器而重新設置。這樣一來,只有最后一次操作能被觸發(fā)。
**節(jié)流:使得一定時間內(nèi)只觸發(fā)一次函數(shù)。原理是通過判斷是否有延遲調(diào)用函數(shù)未執(zhí)行。
區(qū)別:
節(jié)流不管事件觸發(fā)有多頻繁,都會保證在規(guī)定時間內(nèi)一定會執(zhí)行一次真正的事件處理函數(shù),而防抖只是在最后一次事件后才觸發(fā)一次函數(shù)。比如在頁面的無限加載場景下,我們需要用戶在滾動頁面時,每隔一段時間發(fā)一次ajax請求,而不是在用戶停下滾動頁面操作時才去請求數(shù)據(jù)。這樣的場景,就適合用節(jié)流技術來實現(xiàn)。
————————————————
/* 防抖 */
function debounce(func, delay) {
let timer = null;
return function () {
if (timer) {
clearTimeout(timer);
timer = null;
}
timer = setTimeout(() => {
func(...arguments);
}, delay);
};
}
/* 節(jié)流 */
function throttle(func, delay) {
let time = null;
return function () {
let args = Array.from(arguments);
if (time === null) {
time = setTimeout(() => {
func(...args);
clearTimeout(time);
time = null;
}, delay);
}
};
}