防抖(debouncing)和節(jié)流(throttling)都是為了限制函數(shù)的執(zhí)行趾牧。
舉個(gè)例子,當(dāng)用戶頻繁點(diǎn)擊一個(gè)按鈕時(shí),防抖函數(shù)可以讓事件響應(yīng)函數(shù)
- 在點(diǎn)擊后馬上執(zhí)行须床,并且不響應(yīng)之后的一連串點(diǎn)擊
- 或者:讓事件響應(yīng)函數(shù)在這一連串點(diǎn)擊之后執(zhí)行
- 又或者: 在第一次點(diǎn)擊的N毫秒后執(zhí)行
節(jié)流函數(shù)與防抖函數(shù)類似,兩者的差異在于:
- 節(jié)流函數(shù)保證N毫秒內(nèi)渐裂,函數(shù)會被執(zhí)行一次豺旬。比如,在用戶連續(xù)點(diǎn)擊某按鈕的2秒里柒凉,一個(gè)設(shè)置了waitTime為300的被節(jié)流(throttled)函數(shù)族阅,至少會被執(zhí)行6次。
- 防抖函數(shù)在抖動期間只執(zhí)行一次
window.requestAnimationFrame可以用來幫助實(shí)現(xiàn)防抖膝捞、節(jié)流函數(shù)坦刀。Lodash的防抖函數(shù)debounce()里就有用到這個(gè)API,另外蔬咬,Lodash的節(jié)流函數(shù)throttle()也是基于自己的debounce函數(shù)實(shí)現(xiàn)的鲤遥。
lodash的debounce()函數(shù)與throttle()函數(shù)
API文檔:
_.debounce(func, [wait=0], [options={leading: Boolean, trailing: Boolean}])
_.throttle(func, [wait=0], [options={leading: Boolean, trailing: Boolean}])
參考文章
強(qiáng)烈推薦: 一篇圖文并茂的闡述防抖和節(jié)流的文章
Lodash的實(shí)現(xiàn):
lodash/debounce.js
lodash/throttle.js