談談js中的函式節流

2021-09-17 02:16:53 字數 1401 閱讀 7692

從字面上就可以理解,函式節流就是用來節流函式從而一定程度上優化效能的。例如,dom 操作比起非dom 互動需要更多的記憶體和cpu 時間。連續嘗試進行過多的dom 相關操作可能會導致瀏覽器掛起,有時候甚至會崩潰。尤其在ie 中使用onresize 事件處理程式的時候容易發生,當調整瀏覽器大小的時候,該事件會連續觸發。在onresize 事件處理程式內部如果嘗試進行dom 操作,其高頻率的更改可能會讓瀏覽器崩潰。又例如,我們常見的乙個搜尋的功能,我們一般是繫結keyup事件,每按下一次鍵盤就搜尋一次。但是我們的目的主要是每輸入一些內容搜尋一次而已。為了解決這些問題,就可以使用定時器對函式進行節流。

某些**不可以在沒有間斷的情況連續重複執行。第一次呼叫函式,建立乙個定時器,在指定的時間間隔之後執行**。當第二次呼叫該函式時,它會清除前一次的定時器並設定另乙個。如果前乙個定時器已經執行過了,這個操作就沒有任何意義。然而,如果前乙個定時器尚未執行,其實就是將其替換為乙個新的定時器。目的是只有在執行函式的請求停止了一段時間之後才執行。

var processor = ,

//初始處理呼叫的方法

process: function(), 100);

}};//嘗試開始執行

processor.process();

好吧,看得確實有點迷糊。下面通過乙個例子來詳細說明,並且在這個基礎模式之上做乙個優化處理。

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

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

測試主要**:

html:

js:

結果如圖:

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

②使用基本的函式節流模式的情況。

測試主要**:

html:

js:複製**

測試結果如圖:

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

④進一步的優化

進一步的話,就是可以在呼叫throttle函式之前,先對輸入的內容進行判斷,若其值為空、值不變都不用再呼叫。這裡就不詳說了。

詳細改進例項

節流與去抖

js函式節流(Throttle)

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

js原生函式節流

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

JS總結 (一)函式節流

本篇思考三個問題 什麼是函式節流?為什麼要使用函式節流?如何實現?一 基本思想 某些 不可以在沒有間斷的情況連續重複執行。二 使用原因 dom操作比起非dom互動,需要更多的記憶體和cpu時間,連續嘗試過多的dom操作可能會導致瀏覽器掛起,甚至崩潰。三 實現方式 使用定時器對函式進行節流,即第一次呼...