函數(shù)防抖和函數(shù)節(jié)流
函數(shù)防抖(debounce)
當調(diào)用動作過n毫秒后苦囱,才會執(zhí)行該動作讳侨,若在這n毫秒內(nèi)又調(diào)用此動作則將重新計算執(zhí)行時間
函數(shù)節(jié)流(throttle)
預先設定一個執(zhí)行周期陷寝,當調(diào)用動作的時刻大于等于執(zhí)行周期則執(zhí)行該動作,然后進入下一個新
周期
函數(shù)節(jié)流(throttle)與函數(shù)防抖(debounce)都是為了限制函數(shù)的執(zhí)行頻次,以優(yōu)化函數(shù)觸發(fā)頻率過高導致的響應速度跟不上觸發(fā)頻率,出現(xiàn)延遲桂敛,假死或卡頓的現(xiàn)象。
函數(shù)防抖的應用場景
連續(xù)的事件溅潜,只需觸發(fā)一次回調(diào)的場景有:
1:搜索框搜索輸入术唬。只需用戶最后一次輸入完,再發(fā)送請求
2:手機號滚澜、郵箱驗證輸入檢測
3:窗口大小Resize粗仓。只需窗口調(diào)整完成后,計算窗口大小博秫。防止重復渲染潦牛。
函數(shù)節(jié)流的應用場景
間隔一段時間執(zhí)行一次回調(diào)的場景有:
1: 滾動加載,加載更多或滾到底部監(jiān)聽
2:谷歌搜索框挡育,搜索聯(lián)想功能
3:高頻點擊提交,表單重復提交
相同點:
都可以通過使用 setTimeout 實現(xiàn)朴爬。
目的都是即寒,降低回調(diào)執(zhí)行頻率。節(jié)省計算資源。
不同點:
函數(shù)防抖母赵,在一段連續(xù)操作結(jié)束后逸爵,處理回調(diào),利用 clearTimeout 和 setTimeout 實現(xiàn)凹嘲。函數(shù)節(jié)流师倔,在一段連續(xù)操作中,每一段時間只執(zhí)行一次周蹭,頻率較高的事件中使用來提高性能趋艘。
函數(shù)防抖關注一定時間連續(xù)觸發(fā),只在最后執(zhí)行一次凶朗,而函數(shù)節(jié)流側(cè)重于一段時間內(nèi)只執(zhí)行一次瓷胧。
2: 什么是事件委托?為什么要用事件委托棚愤?
什么是事件委托
事件委托就是利用事件冒泡搓萧,只制定一個時間處理程序,就可以管理某一類型的所有事件宛畦。
為什么要用事件委托
因為需要不斷的與dom節(jié)點進行交互瘸洛,訪問dom的次數(shù)越多,引起瀏覽器重繪與重排的次數(shù)也就越多次和,就會延長整個頁面的交互就緒時間反肋,這就是為什么性能優(yōu)化的主要思想之一就是減少DOM操作的原因;每個函數(shù)都是一個對象斯够,是對象就會占用內(nèi)存囚玫,對象越多,內(nèi)存占用率越大读规,100個li就要占用100個內(nèi)存空間抓督。如果要用事件委托,就會將所有的操作放到js程序里面束亏,只對它的父級(如果只有一個父級)這一個對象進行操作铃在,與dom的操作就只需要交互一次,這樣就能大大的減少與dom的交互次數(shù)碍遍,提高性能定铜;
原生 JS 的 window.onload 與 Jquery 的$(document).ready(function(){})
window.onload 是在 dom 文檔樹加載完和所有文件加載完之后執(zhí)行一個函數(shù) document.ready 原生中
沒有這個方法,jquery 中有 (document).ready 要比 window.onload 先執(zhí)行
window.onload 只能出來一次,$(document).ready 可以出現(xiàn)多次