函式防抖和函式節流

2022-03-02 01:03:55 字數 2350 閱讀 8063

這裡介紹一下函式防抖和函式節流,主要用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秒內只允許乙個人通過,即使多個人同時刷卡,也只允許乙個人通過。運用場景 如果我們在改變瀏覽器的大小或者監聽滑鼠移動事件等事件 短時間內觸發多次 為了節省瀏覽器效能開銷,就可...