這裡介紹一下函式防抖和函式節流,主要用js 舉例。當你看完的時候你就發現自己以前就用過,只是不知道它的專業術語,好吧,讓我們來了解一下。
函式防抖
什麼是函式防抖呢?
假設在這樣一種情況下,比如說我們這樣那樣希望在滾動後,做某些操作,但是呢?
這裡分析一下,就是要在滾動後,什麼是滾動後呢?就是滾動不動了,那麼就是滾動後。
我們可以監聽滾動事件:
//給頁面綁定滑輪滾動事件
if (document.addeventlistener)
//滾動滑輪觸發scrollfunc方法 //ie 谷歌
window.onmousewheel = document.onscroll= scrollfunc;
function scrollfunc
如果我們滾動一下就去執行我們的事件,那麼就會造成很多事情,比如說如卡頓,再比如說執行多次不符合我們的預期,也就是功能沒有實現。
那麼這個問題,就是因為我們沒有做到滾動後。有些系統沒有提供滾動後的事件,那麼我們得自己實現。
那麼就得回到滾動後這個事件中來,滾動後就是滾動後一段時間內不動,那麼就是滾動後。
那麼可以這樣寫:
function debounce(fn,wait)
timer = settimeout(fn,wait);
}}
function handle()
window.addeventlistener("onscroll",debounce(handle,1000));
這裡可能有大家困惑的乙個問題,debounce 多次執行,debounce 中的timer 沒有執行不是會為空嗎?那麼(timer !== null) 不是不成立嗎?
這裡就需要我們看仔細了,我們多次執行的是:
function()
timer = settimeout(fn,wait);
}
而不是debounce,因為閉包原因,那麼他們共享乙個timer,所以是這樣的了,通常共享乙個timer 也是用閉包寫法不然,全域性的話會汙染的。
那麼這樣就是結束了,或者說debounce 是否完善了? 答案是否定的,在我們的handle 並不能獲取到滾動的引數,比如說滾動的距離等,那麼我們需要傳遞一下。
還有乙個原因就是this的問題,如果不這樣的話,this會變化的。
這個我們得到的this是
。
如果想詳細了解這一塊,需要去了解閉包這一塊,可以去看我的閉包這一塊,或者網上搜。
function debounce(fn, wait)
}}
這樣就ok了。
在函式防抖中,還有另外一種就是立即執行版。
立即執行的含義也是非常有意思的。還是拿這個滾動說事。
我希望在滾動的時候立馬執行乙個函式,但是呢,在之後繼續滾動過程中,希望不要執行了。
function debounce(fn, wait)
timer = settimeout(() => , wait);
if(iscall)
}}
其實是這樣乙個過程,如果有timer,那麼幹好清理timer的事,如果沒有timer 那麼執行需要呼叫的函式。
為了我們方便呼叫,可以結合成乙個:
function debounce(fn, wait, immediate)
if (immediate) , wait);
if (iscall)
} else , wait);
} }
}
immediate 設定是立即執行版,還是延遲版。
函式節流
那麼什麼函式節流呢?假如有這樣乙個需求,有乙個畫板,現在我們有乙個需求就是在畫畫的時候,每隔幾秒,儲存一次當時的畫板的情況。
那麼這個時候不能單純的settimerout,因為這裡的需求是畫畫的時候,也就是我們在畫的時候。那麼這個時候我們要監聽到手指移動事件,
並且幾秒執行一次。
function throttle(fn,wait), wait);
} }}
每次timer=null的時候我們才去設定settimeout ,這樣就好了。
當然記時方式有很多,我們也可以使用時間戳的方式。
function throttle(fn,wait)
}}
一般在專案中,兩種一般取乙個,而防抖一般都會用到,需求不一樣。 函式防抖和函式節流
1 函式防抖 函式防抖是指頻繁觸發的情況下,只有足夠的時間,才執行 一次,函式防防抖的要點也是要乙個settimeout來輔助實現,延遲執行需要跑的 如果方法多次觸發,則把上次記錄的延遲執行 用cleartimeout清理掉,重新開始。如果計時完畢,沒有方法來訪問觸發。則執行 函式防抖的應用場景,最...
函式防抖和函式節流
首先分別用一句話區分函式防抖和節流的區別。函式防抖就是在使用者停下相應動作,並在給定時間過去之後僅被呼叫一次。函式節流是使用者在執行相應動作時,每隔一段時間發一次請求。針對一些頻繁觸發的事件如scroll keyup resize,如果正常繫結事件的話,可能在很短的時間內連續觸發事件,十分影響效能。...
函式節流和函式防抖
概念 在規定的時間段內 例如1000ms 即使事件觸發了很多次,都只執行一次對應的任務。栗子 在我們進入地鐵站時通過閘機,每隔3秒內只允許乙個人通過,即使多個人同時刷卡,也只允許乙個人通過。運用場景 如果我們在改變瀏覽器的大小或者監聽滑鼠移動事件等事件 短時間內觸發多次 為了節省瀏覽器效能開銷,就可...