JS中的函式節流throttle詳解和優化

2022-04-02 00:52:06 字數 1995 閱讀 9336

js中的函式節流throttle詳解和優化

在前端開發中,有時會為頁面繫結resize事件,或者為乙個頁面元素繫結拖拽事件(mousemove),這種事件有乙個特點,在乙個正常的操作中,有可能在乙個短的時間內觸發非常多次事件繫結程式。

dom操作時很消耗效能的,如果你為這些事件繫結一些操作dom節點的操作的話,那就會引發大量的計算,在使用者看來,頁面可能就一時間沒有響應,這個頁面一下子變卡了變慢了。在ie下,如果你繫結的resize事件進行較多dom操作可能直接就崩潰了。

怎麼解決?函式節流(throttle)就是一種辦法。

函式節流的原理

某些**不可以在沒有間斷的情況連續重複執行。

第一次呼叫函式,建立乙個定時器,在指定的時間間隔之後執行**。

當第二次呼叫該函式時,它會清除前一次的定時器並設定另乙個。

如果前乙個定時器已經執行過了,這個操作就沒有任何意義。

然而,如果前乙個定時器尚未執行,其實就是將其替換為乙個新的定時器。

目的是只有在執行函式的請求停止了一段時間之後才執行。

簡單點說就是:當觸發乙個事件時,先settimout讓這個事件延遲一會再執行,如果在這個時間間隔內又觸發了事件,那我們就clear掉原來的定時器,再settimeout乙個新的定時器延遲一會執行。

實際使用過程中考慮到使用者體驗問題,會在這個基礎上做一些優化。

乙個簡單實現的例子:

函式實現方式:

function

throttle(method, context) , 100);

}

呼叫方法:

window.onresize = function

()

閉包實現方式:

var throttle = function

(fn, delay), delay);

};};

呼叫方法:

window.onresize = throttle(myfunc, 50);

-------------

上面的函式節流有個問題是:只要你在50ms內不間斷resize,myfunc就一次都不執行處理函式。

對上面的節流函式做拓展:

var throttlev2 = function

(fn, delay, mustrundelay)

if(t_curr - t_start >=mustrundelay)

else

, delay);}};

};

拓展後的節流函式公升級版,可以設定第三個引數,即必須觸發執行的時間間隔。

方法呼叫:

window.onresize = throttlev2(myfunc, 50, 100);

50ms的間隔內連續觸發的呼叫,後乙個呼叫會把前乙個呼叫的等待處理掉,但每隔100ms至少執行一次。

一開始記錄第一次呼叫的時間戳,然後每次呼叫函式都去拿最新的時間跟記錄時間比,超出給定的時間就執行一次,更新記錄時間。

-----------------

例子場景2:實現常見的搜尋功能

1.沒有使用函式節流的情況下,為input繫結keyup事件處理函式,在控制台輸出我輸入的內容。

每按下乙個鍵盤鍵,就輸出了一次。短短的一些內容,輸出了15次,如果每一次都是一次ajax查詢請求的話就發了14個請求了。在效能上的消耗可想而知。

假如我不斷地輸入,輸入了很多內容,但是我每兩次之間的輸入間隔都小於自己設定的delay值,那麼,這個querydata搜尋函式就一直得不到呼叫。實際上,我們更希望的是,當達到某個時間值時,一定要執行一次這個搜尋函式。所以,就有了函式節流的改進模式。

函式節流增強版

html:

js:

顯然,連續的輸入,到一定時間間隔之後,querydata函式必然會被呼叫,但是又不是頻繁的呼叫。達到了節流的目的,又不會影響使用者體驗。

進一步的優化可以在呼叫throttle函式之前,先對輸入的內容進行判斷,若其值為空、值不變不呼叫。

談談js中的函式節流

從字面上就可以理解,函式節流就是用來節流函式從而一定程度上優化效能的。例如,dom 操作比起非dom 互動需要更多的記憶體和cpu 時間。連續嘗試進行過多的dom 相關操作可能會導致瀏覽器掛起,有時候甚至會崩潰。尤其在ie 中使用onresize 事件處理程式的時候容易發生,當調整瀏覽器大小的時候,...

js函式節流(Throttle)

在瀏覽器 dom 事件裡面,有一些事件會隨著使用者的操作不間斷觸發。比如 重新調整瀏覽器視窗大小 resize 瀏覽器頁面滾動 scroll 滑鼠移動 mousemove 也就是說使用者在觸發這些瀏覽器操作的時候,如果指令碼裡面繫結了對應的事件處理方法,這個方法就不停的觸發。而當事件處理比較複雜的時...

js原生函式節流

函式節流就是一定時間內只觸發一次函式。原理是通過判斷是否到達一定時間來觸發函式。時間戳方案 function throttle fn,wait function handle window.addeventlistener mousemove throttle handle,1000 定時器方案 f...