JavaScript節(jié)流函數(shù)Throttle詳解

JavaScript節(jié)流函數(shù)Throttle詳解

ID:47700538

大?。?24.50 KB

頁數(shù):6頁

時間:2019-10-22

JavaScript節(jié)流函數(shù)Throttle詳解_第1頁
JavaScript節(jié)流函數(shù)Throttle詳解_第2頁
JavaScript節(jié)流函數(shù)Throttle詳解_第3頁
JavaScript節(jié)流函數(shù)Throttle詳解_第4頁
JavaScript節(jié)流函數(shù)Throttle詳解_第5頁
資源描述:

《JavaScript節(jié)流函數(shù)Throttle詳解》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫

1、在瀏覽器DOM事件里面,有一些事件會隨著用戶的操作不間斷觸發(fā)。比如:重新調(diào)整瀏覽器窗口大小(resize),瀏覽器頁面滾動(scroll),鼠標(biāo)移動(mousemove)。也就是說用戶在觸發(fā)這些瀏覽器操作的時候,如果腳木里面綁定了對應(yīng)的事件處理方法,這個方法就不停的觸發(fā)。這并不是我們想要的,因為有的時候如果事件處理方法比較龐人,DOM操作比如復(fù)雜,還不斷的觸發(fā)此類事件就會造成性能上的損失,導(dǎo)致用戶體驗下降(UI反映慢、瀏覽器卡死等)。所以通簾來講我們會給相應(yīng)事件添加延遲執(zhí)行的邏輯。通常來說我們用卜?面的代碼來實現(xiàn)這個功能:varCOUNT=0;functiontestF

2、n(){console.log(COUNT++);}//瀏覽器resize的時候//1.清除之前的計時器//2.添加一個計時器讓真正的函數(shù)testFn延后100毫秒觸發(fā)window.onresize=function(){vartimer=null;clearTimeout(timer);timer=setTimeout(function(){testFn();},100);};細心的同學(xué)會發(fā)現(xiàn)上面的代碼其實是錯課的,這是新手會犯的一個問題:setTimeout函數(shù)返I川值應(yīng)該保存在一個相對全局變最里面,否則每次resize的時候都會產(chǎn)生一個新的計時器,這樣就達不到我們

3、發(fā)的效果了于是我們修改了代碼:vartimer=null;window.onresize=function(){clearTimeout(timer);timer=setTimeout(function(){testFn();},100);};這時候代碼就正常了,但是又多了一個新問題——產(chǎn)生了一個全局變量timerc這是我們不想見到的,如果這個頁面述有別的功能也叫timer不同的代碼Z前就是產(chǎn)生沖突。為了解決這個問題我們要用JavaScript的一個語言特性:閉包closureso相關(guān)知識讀者可以去MDN中了解,改造后的代碼如下:/***函數(shù)節(jié)流方法*@paramFun

4、ctionfn延時調(diào)用函數(shù)*@paramNumberdelay延遲多長時間*@returnFunction延遲執(zhí)行的方法*/varthrottle=function(fn#delay){vartimer=null;returnfunction(){clearTimeout(timer);timer=setTimeout(function(){fn();}/delay);};window?onresize=throttle(testFn,200,1000);我們用一個閉包函數(shù)(throttle節(jié)流)把timer放在內(nèi)部并返回延時處理函數(shù),這樣以來timer變量對外是不可見

5、的,但是內(nèi)部延時函數(shù)觸發(fā)時還可以訪問到timer變量。當(dāng)然這種寫法對于新手來說不好理解,我們口J以變換一種寫法來理解一下:varthrottle=function(fn#delay){vartimer=null;returnfunction(){clearTimeout(timer);timer=setTimeout(function(){fn();}/delay);}};varf=throttle(testFn,200);window.onresize=function(){f0;};這里主要了解一點:Throttle被調(diào)用后返回的function才是真正的onres

6、ize觸發(fā)時需要調(diào)用的函數(shù)現(xiàn)在看起來這個方法已經(jīng)接近完美了,然而實際使用中并非如此。舉個例子:如果用戶不斷的resize瀏覽器窗口大小,這時延遲處理函數(shù)一次都不會執(zhí)行于是我們又要添加一個功能:當(dāng)用戶觸發(fā)resize的時候應(yīng)該在某段時間內(nèi)至少觸發(fā)一次,既然是在某段時間內(nèi),那么這個判斷條件就可以取當(dāng)前的時間毫秒數(shù),每次函數(shù)調(diào)川把當(dāng)前的時間和上一次調(diào)用時間和減,然后判斷差值如果大于某段時間就直接觸發(fā),否則還是走timeout的延遲邏輯。下面的代碼里面需要指出的是:1.previous變量的作用和timer類似,都是記錄上一次的標(biāo)識,必須是相對的全局變量2.如果邏輯流程走的是“

7、至少觸發(fā)一次"的邏輯,那么函數(shù)調(diào)用完成需要把previous重置成當(dāng)詢吋間,簡單來說就是:相對于下一次的上一次其實就是當(dāng)前/★★*函數(shù)節(jié)流方法*@paramFunctionfn延時調(diào)川函數(shù)*@paramNumberdelay延遲多長時間*@paramNumberatleast至少多長時間觸發(fā)一次*@returnFunction延遲執(zhí)彳亍的方法*/varthrottle=function(fn#delay,atleast){vartimer=null;varprevious=null;returnfunction(){varnow=+new

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。