JavaScript 函數節流詳解及方法實例詳解
這篇文章主要介紹了JavaScript 函數節流詳解及實例的相關資料,需要的朋友可以參考下
JavaScript 函數節流詳解
瀏覽器一個網頁的UI線程只有一個,他同時會處理介面的渲染和頁面JavaScript代碼的執行(簡單擴展一下,瀏覽器或者JavaScript運行大環境並不是單線程,諸如ajax異步回調、 hybrid框架內與native通訊、事件佇列、CSS執行緒等等都屬於多執行緒環境,不過ES6引入了Promise類別來減少了部分非同步情況)。因此當JavaScript程式碼運行計算量很大的方法時,就有可能阻塞UI線程,小則導致使用者回應卡頓,嚴重的情況下瀏覽器會提示頁面無回應是否強制關閉。例如網頁的頁面捲動事件、行動裝置的滑動、縮放事件等。即使沒有出現嚴重的效能問題,我們也應該站在效能最佳化的角度將短時間內會多次觸發的大規模處理時間進行分流計算。
如何有效避免UI執行緒運行過長的程式碼,是所有使用者互動應用程式需要考慮的問題,同樣的問題在客戶端Android可以使用UI主執行緒開子線程來分散計算。與此對應的,js也可以透過引入webWorker來分散計算,但是在js中有一個更簡單且效果不錯的方法:函數節流。 使用函數節流的核心技巧就是使用計時器分段計算。具體的實現方式大致上有兩種思路。
·方法一
1.這種實作方式的想法很好理解:設定一個一間隔時間,例如50毫秒,以此時間為基準設定定時器,當第一次觸發事件到第二次觸發事件間隔小於50毫秒時,清除這個定時器,並設定一個新的定時器,以此類推,直到有一次事件觸發後50毫秒內沒有重複觸發。程式碼如下:
function debounce(method){ clearTimeout(method.timer); method.timer=setTimeout(function(){ method(); },50); }
這種設計方式有一個問題:本來應該多次觸發的事件,可能最終只會發生一次。具體來說,一個循序漸進的滾動事件,如果使用者滾動太快速,或者程式設定的函數節流間隔時間太長,那麼最終滾動事件會呈現為一個很突然的跳躍事件,中間過程都被節流截掉了。這個例子舉的有點誇張了,不過使用這種方式進行節流最終是會明顯感受到程式比不節流的時候“更突兀”,這對於用戶體驗是很差的。有一種彌補這種缺陷的設計想法。
·方法二
2.第二種實作方式的想法與第一種稍有差異:設定一個間隔時間,例如50毫秒,以此時間為基準穩定分隔事件觸發狀況,也就是說100毫秒內連續觸發多次事件,也只會依照50毫秒一次穩定分隔執行。程式碼如下:
var oldTime=new Date().getTime(); var delay=50; function throttle1(method){ var curTime=new Date().getTime(); if(curTime-oldTime>=delay){ oldTime=curTime; method(); } }
相比於第一種方法,第二種方法也許會比第一種方法執行更多次(有時意味著更多次請求後台,即更多的流量) ,但是卻很好的解決了第一種方法清除中間過程的缺陷。因此在具體場景應根據情況擇優決定使用哪種方法。
對於方法二,我們再提供另一種同樣功能的寫法:
var timer=undefined,delay=50; function throttle2(method){ if(timer){ return ; } method(); timer=setTimeout(function(){ timer=undefined; },delay); }
最後說點個外話,說明一下函數節流的名稱問題,大家往往會看到throttle和debounce兩個方法名,throttle可以翻譯為“節制,卡住”,debounce可以翻譯為“防反跳”。在《JavaScript高階程式設計》中作者介紹了方法一,作者使用了「throttle」這個函數名稱。而在《第三方JavaScript程式設計》書中同時出現了方法一和方法二,作者將方法一命名為“debounce”,將方法二命名為“throttle”。國內在同時介紹兩個方法的時候有些文章錯誤的將方法一命名為“throttle”,而將方法二命名為“debounce”,從英語的角度來說是很不負責任的。因此在這裡撥亂反正:方法一適合理解為“防反跳”,應命名為“debounce”;方法二適合理解為“函數節制”,應命名為“throttle”。
以上是JavaScript 函數節流詳解及方法實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

番茄小說是一款非常熱門的小說閱讀軟體,我們在番茄小說中經常會有新的小說和漫畫可以去閱讀,每一本小說和漫畫都很有意思,很多小伙伴也想著要去寫小說來賺取賺取零用錢,在把自己想要寫的小說內容編輯成文字,那麼我們要怎麼樣在這裡面去寫小說呢?小伙伴們都不知道,那就讓我們一起到本站本站中花點時間來看寫小說的方法介紹。分享番茄小說寫小說方法教學 1、先在手機上打開番茄免費小說app,點擊個人中心——作家中心 2、跳到番茄作家助手頁面——點擊創建新書在小說的結

七彩虹主機板在中國國內市場享有較高的知名度和市場佔有率,但是有些七彩虹主機板的用戶還不清楚怎麼進入bios進行設定呢?針對這一情況,小編專門為大家帶來了兩種進入七彩虹主機板bios的方法,快來試試吧!方法一:使用u盤啟動快捷鍵直接進入u盤裝系統七彩虹主機板一鍵啟動u盤的快捷鍵是ESC或F11,首先使用黑鯊裝機大師製作一個黑鯊U盤啟動盤,然後開啟電腦,當看到開機畫面的時候,連續按下鍵盤上的ESC或F11鍵以後將會進入到一個啟動項順序選擇的窗口,將遊標移到顯示“USB”的地方,然

而後悔莫及、人們常常會因為一些原因不小心刪除某些聯絡人、微信作為一款廣泛使用的社群軟體。幫助用戶解決這個問題,本文將介紹如何透過簡單的方法找回被刪除的聯絡人。 1.了解微信聯絡人刪除機制這為我們找回被刪除的聯絡人提供了可能性、微信中的聯絡人刪除機制是將其從通訊錄中移除,但並未完全刪除。 2.使用微信內建「通訊錄恢復」功能微信提供了「通訊錄恢復」節省時間和精力,使用者可以透過此功能快速找回先前刪除的聯絡人,功能。 3.進入微信設定頁面點選右下角,開啟微信應用程式「我」再點選右上角設定圖示、進入設定頁面,,

Win11管理員權限取得方法匯總在Windows11作業系統中,管理員權限是非常重要的權限之一,可以讓使用者對系統進行各種操作。有時候,我們可能需要取得管理員權限來完成一些操作,例如安裝軟體、修改系統設定等。下面就為大家總結了一些取得Win11管理員權限的方法,希望能幫助大家。 1.使用快捷鍵在Windows11系統中,可以透過快捷鍵的方式快速開啟命令提

手機遊戲成為了人們生活中不可或缺的一部分,隨著科技的發展。它以其可愛的龍蛋形象和有趣的孵化過程吸引了眾多玩家的關注,而其中一款備受矚目的遊戲就是手機版龍蛋。幫助玩家們在遊戲中更好地培養和成長自己的小龍,本文將向大家介紹手機版龍蛋的孵化方法。 1.選擇合適的龍蛋種類玩家需要仔細選擇自己喜歡並且適合自己的龍蛋種類,根據遊戲中提供的不同種類的龍蛋屬性和能力。 2.提升孵化機的等級玩家需要透過完成任務和收集道具來提升孵化機的等級,孵化機的等級決定了孵化速度和孵化成功率。 3.收集孵化所需的資源玩家需要在遊戲中

字體大小的設定成為了重要的個人化需求,隨著手機成為人們日常生活的重要工具。以滿足不同使用者的需求、本文將介紹如何透過簡單的操作,提升手機使用體驗,調整手機字體大小。為什麼需要調整手機字體大小-調整字體大小可以使文字更清晰易讀-適合不同年齡段用戶的閱讀需求-方便視力不佳的用戶使用手機系統自帶字體大小設置功能-如何進入系統設置界面-在在設定介面中找到並進入"顯示"選項-找到"字體大小"選項並進行調整第三方應用調整字體大小-下載並安裝支援字體大小調整的應用程式-開啟應用程式並進入相關設定介面-根據個人

Oracle版本查詢方法詳解Oracle是目前世界上最受歡迎的關聯式資料庫管理系統之一,它提供了豐富的功能和強大的效能,廣泛應用於企業。在進行資料庫管理和開發過程中,了解Oracle資料庫的版本是非常重要的。本文將詳細介紹如何查詢Oracle資料庫的版本信息,並給出具體的程式碼範例。查詢資料庫版本的SQL語句在Oracle資料庫中,可以透過執行簡單的SQL語句

在現今社會,手機已經成為我們生活中不可或缺的一部分。而微信作為我們日常溝通、工作、生活的重要工具,更是經常被使用。然而,在處理不同事務時可能需要分開兩個微信帳號,這就要求手機能夠支援同時登入兩個微信帳號。華為手機作為國內知名品牌,很多人使用,那麼華為手機開啟兩個微信帳號的方法是怎麼樣的呢?下面就來揭秘一下這個方法。首先,要在華為手機上同時使用兩個微信帳號,最簡
