說明:這篇文章節(jié)選自John Resig 的《Secrets of the JavaScript Ninja》一書,本人翻譯只是供大家學習,翻譯不足之處,請斧正。
這篇文章主要從下面幾個方面解讀計時器:
- 計時器概述;
- 計時器速度深度探析;
- 用計時器處理大量任務(wù);
- 利用計時器管理動畫;
- 較好的計時器測試
計時器是一個我們了解很少且經(jīng)常被濫用的東西,它是javascript的特色。實際上,在復(fù)雜的應(yīng)用程序開發(fā)中,它能為我們提供很多幫助。計時器提供了一個可以將代碼片段異步延時執(zhí)行的能力,javascript生來是單線程的(在一定時間范圍內(nèi)僅一部分js代碼能運行),計時器為我們提供了一種避開這種限制的方法,從而開辟了另一條執(zhí)行代碼的蹊徑。
有趣的是,與我們普遍接受的觀點相反,計時器并不是javascript語言的一部分,而是瀏覽器引入的方法和對象的一部分。這意味著如果你選擇在一個非瀏覽器的環(huán)境運行它,很有可能計時器不存在,你必須使用特定功能推行你自己的版本(如Rhino線程)。
1、計時器是如何工作的
從根本上來說,理解計時器如何工作很重要。通常情況下,計時器的行為并不直觀,因為它在一個單獨的線程中,讓我們從三個函數(shù)的測試開始,對于每一個函數(shù)我們都有機會構(gòu)建和控制計時器。
- var id = setTimeout(fn,delay);啟動一個計時器,它將在延遲時間之后調(diào)用特定的函數(shù),該函數(shù)返回一個唯一的ID,利用這個ID計時器在稍后的時間里被取消;
- var id = setInterval(fn,delay);與setTimeout相似,但它不斷的調(diào)用函數(shù)(每隔一定延遲時間)直到它被取消;
- clearInterval(id),clearTimeout(id);接受計時器的 ID(由上述任意一個函數(shù)返回)并停止調(diào)用計時器。
為了理解計時器內(nèi)部是如何工作的,有一個很重要的概念需要加以探討:延遲是無法保證的。既然瀏覽器中所有javascript 是在一個單線程中運行的,那么異步事件(如鼠標點擊、計時器)在執(zhí)行中也只有存在開放狀態(tài)時才運行,下面這張圖很好的說明了這個問題:
這張圖有很多信息需要消化,充分理解它將使你對異步j(luò)s執(zhí)行有一個更好的認識,圖表是一維的,在垂直方向上是時間(掛鐘),以毫秒為單位。藍色盒子代表js執(zhí)行的比例。例如,第一個javascript塊運行時間大約為18秒,鼠標點擊大約為11秒等等。
出處:
責任編輯:bluehearts
上一頁 下一頁 解讀javascript的計時器 [2]
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|