javascript高級 --- 函數防抖和函數節流

一、介紹
在某些特定場景下,函數可能會被頻繁的調用,回調中又會發生DOM操作,瀏覽器繼而重排與重繪,造成很嚴重的性能問題。

二、案例
例如:window.onresize / window.onscroll、頻繁的onmousemove onkeyup

解決類似問題:函數防抖(debounce)、函數節流(throttle),核心就是限制一個函數的頻繁觸發


函數防抖:

顧名思義,利用函數實現防抖動,觸發函數時,元素的位置或者尺寸發生變化,導致頁面迴流,進而元素抖動,通過函數防抖,使得函數在一定時間內延遲執行一次,從而減少頁面迴流

通過定時器延遲執行當前函數

function debounce(fun, time = 800){
	clearTimeout(fun.timer)
	fun.timer = setTimeout(function = > {
		fun()
	},time)
}

debounce(scroll())

函數防抖基本實現,會發現當前的event對象爲undefined,強制綁定this,並且賦值參數

function debounce(fun, time = 800){
	clearTimeout(fun.timer)
	fun.timer = setTimeout(function = > {
		fun.apply(this,arguments)
	},time)
}

debounce(scroll())

函數節流:

限制函數執行的頻率,如果當前函數未執行完畢,未來的執行都會被忽略

function throttle(fun, time = 800) {
	if (fun.timer) return
	fun.timer = setTimeout(function = > {
		fun.apply(this,arguments)
		clearTimeout(fun.timer)
	},time)
}

debounce(scroll())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章