版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、JS中setTimeout的奇妙用法前端函數節(jié)流_ 這篇文章主要介紹了JS中setTimeout的奇妙用法前端函數節(jié)流 的相關資料,需要的伴侶可以參考下 什么是函數節(jié)流? 函數節(jié)流簡潔的來說就是不想讓該函數在很短的時間內連續(xù)被調用,比如我們最常見的是窗口縮放的時候,常常會執(zhí)行一些其他的操作函數,比如發(fā)一個ajax懇求等等事情,那么這時候窗口縮放的時候,有可能連續(xù)發(fā)多個懇求,這并不是我們想要的,或者是說我們常見的鼠標移入移出tab切換效果,有時候連續(xù)且移動的很快的時候,會有閃耀的效果,這時候我們就可以用法函數節(jié)流來操作。大家都知道,DOM的操作會很消耗或影響性能的,假如是說在窗口縮放的時候,為元
2、素綁定大量的dom操作的話,會引發(fā)大量的連續(xù)計算,比如在IE下,過多的DOM操作會影響掃瞄器性能,甚至嚴峻的狀況下,會引起掃瞄器崩潰的發(fā)生。這個時候我們就可以用法函數節(jié)流來優(yōu)化代碼了 函數節(jié)流的基本原理: 用法一個定時器,先延時該函數的執(zhí)行,比如用法setTomeout()這個函數延遲一段時間后執(zhí)行函數,假如在該時間段內還觸發(fā)了其他大事,我們可以用法清除方法 clearTimeout()來清除該定時器,再setTimeout()一個新的定時器延遲一會兒執(zhí)行。 最近在某團隊忙于一個項目,有這么一個頁面,采納傳統模式開發(fā)(吐槽它為什么不用React),它的DOM操作比較多,然后性能是比較差的,尤其
3、當你縮放窗口時,可怕的事情發(fā)生了,消失了卡頓,甚至掃瞄器癱瘓。為什么呢? 由于該頁面的DOM操作特別多,故窗口縮放每一幀時都會觸發(fā)函數的執(zhí)行,連續(xù)的重新DOM操作,這樣對掃瞄器的開銷是特別大的。既然在窗口縮放時,會讓掃瞄器重新計算DOM,那么我們?yōu)槭裁床恍幸宰孌OM的計算延時呢,讓窗口停止縮放后才重新計,這樣不就節(jié)約了掃瞄器的開銷,達到優(yōu)化的效果了嗎? 學問預備 1. setTimeout(code,millisec) 當然就是本文的主角了。 setTimeout() 方法用于在指定的毫秒數后調用函數或計算表達式。 code必需。要調用的函數后要執(zhí)行的 JavaScript 代碼串。 mill
4、isec必需。在執(zhí)行代碼前需等待的毫秒數。 提示:setTimeout() 只執(zhí)行 code 一次。假如要多次調用,請用法 setInterval() 或者讓 code 自身再次調用 setTimeout()。 廣泛應用于定時器,輪播圖,動畫效果,自動滾動等等。 2. clearTimeout(id_of_setTimeout) 參數 id_of_settimeout由 setTimeout() 返回的 ID 值。該值標識要取消的延遲執(zhí)行代碼塊。 3. fun.apply(thisArg, argsArray) apply() 方法在指定 this 值和參數(參數以數組或類數組對象的形式存在)
5、的狀況下調用某個函數 該函數的語法與call()方法幾乎相同,唯一的區(qū)分在于,call()方法接受的是一個參數列表,而apply()接受的是一個包含多個參數數組的(或類數組對象)。 參數 thisArg 在 fun 函數運行時指定的 this 值。需要留意的是,指定的 this 值并不肯定是該函數執(zhí)行時真正的 this 值,假如這個函數處于非嚴格模式下,則指定為 null 或 undefined 時會自動指向全局對象(掃瞄器中就是window對象),同時值為原始值(數字,字符串,布爾值)的 this 會指向該原始值的自動包裝對象。 argsArray 一個數組或者類數組對象,其中的數組元素將作
6、為單獨的參數傳給 fun 函數。假如該參數的值為null 或 undefined,則表示不需要傳入任何參數。從ECMAScript 5 開頭可以用法類數組對象。 在調用一個存在的函數時,你可以為其指定一個 this 對象。 this 指當前對象,也就是正在調用這個函數的對象。 用法 apply, 你可以只寫一次這個方法然后在另一個對象中繼承它,而不用在新對象中重復寫該方法。 4. fun.call(thisArg, arg1, arg2, .) 該 方法在用法一個指定的this值和若干個指定的參數值的前提下調用某個函數或方法. 參數 thisArg 在fun函數運行時指定的this值。需要留意
7、的是,指定的this值并不肯定是該函數執(zhí)行時真正的this值,假如這個函數處于非嚴格模式下,則指定為null和undefined的this值會自動指向全局對象(掃瞄器中就是window對象),同時值為原始值(數字,字符串,布爾值)的this會指向該原始值的自動包裝對象。 arg1, arg2, . 指定的參數列表。 當調用一個函數時,可以賦值一個不同的 this 對象。this 引用當前對象,即 call 方法的第一個參數。通過 call 方法,你可以在一個對象上借用另一個對象上的方法,比如Ototype.toString.call(),就是一個Array對象借用了Objec
8、t對象上的方法。 作用: 用法call方法調用父構造函數 用法call方法調用匿名函數 用法call方法調用匿名函數并且指定上下文的this 這里插個題外話: apply 與 call() 特別相像,不同之處在于供應參數的方式。apply 用法參數數組而不是一組參數列表。apply 可以用法數組字面量(array literal),如 fun.apply(this, eat, bananas),或數組對象, 如 fun.apply(this, new Array(eat, bananas)。你也可以用法 arguments 對象作為 argsArray 參數。 arguments 是一個函數的
9、局部變量。 它可以被用作被調用對象的全部未指定的參數。 這樣,你在用法apply函數的時候就不需要知道被調用對象的全部參數。 你可以用法arguments來把全部的參數傳遞給被調用對象。 被調用對象接下來就負責處理這些參數。 從 ECMAScript 第5版開頭,可以用法任何種類的類數組對象,就是說只要有一個 length 屬性和0.length) 范圍的整數屬性。例如現在可以用法 NodeList 或一個自己定義的類似 length: 2, 0: eat, 1: bananas 形式的對象。 call, apply方法區(qū)分是,從其次個參數起, call方法參數將依次傳遞給借用的方法作參數,
10、而apply 挺直將這些參數放到一個數組中再傳遞, 最終借用方法的參數列表是一樣的. 應用場景:當參數明確時可用call, 當參數不明確時可用apply給合arguments 現在先給出一個例子 總所皆知,onscolll,onresize等是特別耗性能,窗口縮放時打印數字。 var count = ; window.onresize = function () count+; console.log(count); 在chrome掃瞄器中伸縮掃瞄器窗口大小,打印如下 這明顯不是我們想要的,那假如我們換成ajax懇求的話,那么就會縮放一次窗口會連續(xù)觸發(fā)多次ajax懇求,下面我們試著用法函數節(jié)流
11、的操作試試一下;當然加個settimeout()的定時器就好了, 第一種封裝方法 var count = ; function oCount() count+; console.log(count); window.onresize = function () delayFun(oCount) ; function delayFun(method, thisArg) clearTimeout(ps); ps = setTimeout(function () method.call(thisArg) , ) 其次種封裝方法 構造一個閉包,用法閉包的方式形成
12、一個私有的作用域來存放定時器timer, timer是通過傳參數的形式引入的。 var count = ; function oCount() count+; console.log(count); var funs= delayFun(oCount,); window.onresize = function () funs() ; function delayFun(func, wait) var timer = null; return function () var context = this, args = arguments; clearTimeout(timer); timer
13、= setTimeout(function () func.apply(context, args); , wait) ; 對其次種方法優(yōu)化一下,性能會更好 這里返回一個函數,假如它被不間斷地調用,它將不會得到執(zhí)行。該函數在停止調用 N 毫秒后,再次調用它才會得到執(zhí)行。假如有傳遞 immediate 參數,會馬上將函數支配到執(zhí)行隊列中,而不會延遲。 function delayFun (func, wait, immediate) var timeout; return function() var context = this, args = arguments; var later = f
14、unction() timeout = null; if (!immediate) func.apply(context, args); ; var callNow = immediate !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); ; ; / 用法 var myEfficientFn = delayFun (function() / 全部繁重的操作 , ); window.addEventListener(resize, myEfficientFn); 函數不允許回調函數在指定時間內執(zhí)行多于一次。當為一個會頻繁觸發(fā)的大事安排一個回調函數時,該函數顯得尤為重要。 setTimeout這么厲害,那么我們是可以在項目中大量用法嗎? 我個人是不建議的,在我們業(yè)務中,基本上是禁止在業(yè)務規(guī)律中用法setTimeout的,由于我所看到的許多用法方式都是一些問題好解決,setTimeout作為一個hack的方式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年海島自動氣象遙測系統項目立項申請報告
- 2024-2025學年辛集市三上數學期末教學質量檢測試題含解析
- 2025年安全專業(yè)軟件項目規(guī)劃申請報告模范
- 2025年油田注劑項目提案報告模范
- 感恩話題作文(匯編15篇)
- 名著閱讀活動總結5篇
- 新學期學習計劃(集錦15篇)
- 大學生寒假社會實踐心得(5篇)
- 庫管的述職報告-
- 我們的節(jié)日重陽節(jié)演講10篇
- 2024年時事政治試題【有答案】
- 全套教學課件《工程倫理學》
- 人音版六年級上冊全冊音樂教案(新教材)
- 2024年認證行業(yè)法律法規(guī)及認證基礎知識
- 機械原理課程設計鎖梁自動成型機床切削機構
- 沉井工程檢驗批全套【精選文檔】
- 貝類增養(yǎng)殖考試資料
- 旅游專業(yè)旅游概論試題有答案
- 混凝土熱工計算步驟及公式
- 病理生理學試題及復習資料
- 國電南自遠動服務器作業(yè)指導書1介紹
評論
0/150
提交評論