中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁 > 技術(shù)文檔 > 網(wǎng)頁制作 > 提升JavaScript運行速度之循環(huán)篇
瀏覽器根據(jù)什么來判定腳本失控? 回到列表 JavaScript中盡量用局部變量的原因
 提升JavaScript運行速度之循環(huán)篇

作者:明達(dá) 時間: 2009-02-20 文檔類型:翻譯 來自:七月佑安

根據(jù)Nicholas的說法,有四種代碼會拖慢腳本的運行,并最終導(dǎo)致腳本失控。分別是次數(shù)過多的同步循環(huán)、龐大的函數(shù)體、不恰當(dāng)?shù)倪f歸和不合理的DOM調(diào)用。這篇著重講第一個原因。最后給出了一個開發(fā)模式,替換傳統(tǒng)的循環(huán)結(jié)構(gòu),可以完全避免腳本失控的狀況發(fā)生。

原文標(biāo)題:Speed up your JavaScript, Part 1
原文作者:Nicholas C. Zakas

在我 上一篇帖子譯文)中,談到了各個瀏覽器究竟會在什么情況下彈出腳本失控提示,對于Internet Explorer來說,當(dāng)瀏覽器執(zhí)行了數(shù)量過多的語句時就會停止執(zhí)行腳本,而其他的瀏覽器,則是持續(xù)執(zhí)行腳本超過一定時間的時候就會給出提示。而我們要探討的核心問題,不是這些瀏覽器如果探測失控的腳本,而是我們?nèi)绾尾趴梢宰屇_本運行的更快一些,從而避免這些警告。

腳本失控基本上有以下四個方面的原因:

  1. 在循環(huán)中執(zhí)行了太多的操作。
  2. 臃腫的函數(shù)體
  3. 過多的遞歸
  4. 過多的DOM調(diào)用

在這篇帖子中,我將會把重點放到第一條上:循環(huán)中的過多操作。循環(huán)的操作是同步進(jìn)行的,所以執(zhí)行一個循環(huán)所花費的時間完全取決于循環(huán)的次數(shù)。因此有兩種情況會導(dǎo)致循環(huán)執(zhí)行的時間過長,并直接導(dǎo)致鎖定瀏覽器。一是循環(huán)體中包含了太多的操作,二是循環(huán)的次數(shù)過多。這兩種情況都能直接導(dǎo)致鎖定瀏覽器,并顯示腳本失控的提示。

解決這個問題的訣竅就是用下面這兩個問題來評估每個循環(huán):

  1. 這個循環(huán)必須要同步執(zhí)行么?
  2. 循環(huán)里面的數(shù)據(jù),必須要按順序執(zhí)行么?

如果兩個問題的答案都是否定的話,你就可以選擇將循環(huán)里的操作進(jìn)行分解。關(guān)鍵是要根據(jù)代碼的具體環(huán)境確定上面兩個問題的答案。一個典型的循環(huán)可能像下面這個樣子:

for(var i=0; i < items.length; i++){
   process(items[i]);
}

乍一看這個循環(huán)并沒有太大的問題,是不是會運行很長時間完全取決于循環(huán)的次數(shù)。如果緊接循環(huán)后沒有其他代碼在執(zhí)行的時候需要依賴于循環(huán)的結(jié)果,那么對于第一個問題的答案就是“不”。你還可以發(fā)現(xiàn),循環(huán)每次只處理一個數(shù)值,而且不依賴于上一次循環(huán)的結(jié)果,所以對于第二個問題的答案同樣也是否定的。這就意味著,循環(huán)可以通過某種方式進(jìn)行拆解,不會導(dǎo)致鎖定瀏覽器而顯示腳本失控的提示。

在《Professional JavaScript, Second Edition》這本書中,對于那些執(zhí)行次數(shù)非常巨大的虛幻,我推薦使用下面的方式來處理:

function chunk(array, process, context){
   setTimeout(function(){
       var item = array.shift();
       process.call(context, item);

       if (array.length > 0){
           setTimeout(arguments.callee, 100);
       }
   }, 100);
}

chunk()函數(shù)的用途就是將一個數(shù)組分成小塊處理(這也是名字的由來),我們可以傳遞三個參數(shù)。要處理的數(shù)組對象、處理函數(shù)以及一個可選的上下文變量,用于設(shè)置process()函數(shù)中對應(yīng)的this對象。第一個timer用于處理操作之間的延時(這里設(shè)置為100毫秒,大家可以根據(jù)實際需要自行修改)。每次執(zhí)行這個函數(shù),都會將數(shù)組中的第一個對象取出,并傳給process()函數(shù)進(jìn)行操作,如果這時process()中還有未處理完的對象,另外一個timer就會啟動,用于重復(fù)等待。上面提到的循環(huán),可以通過下面的方法使用這個函數(shù):

chunk(items, process);

需要注意的是,在這里數(shù)組采用了隊列(queue)的形式,而且在循環(huán)的過程中,每次都會發(fā)生修改。如果你要修改數(shù)組的原始狀態(tài),這里介紹兩種途徑:一種是通過concat()函數(shù),在傳遞之前,建立一個當(dāng)前數(shù)組的副本:

chunk(items.concat(), process);

另外一種選擇是直接修改chunk()函數(shù),直接在函數(shù)內(nèi)部進(jìn)行修改:

function chunk(array, process, context){
   var items = array.concat();   //clone the array
   setTimeout(function(){
       var item = items.shift();
       process.call(context, item);

       if (items.length > 0){
           setTimeout(arguments.callee, 100);
       }
   }, 100);
}

注意這種方法要比只保存一個索引安全的多,因為數(shù)組的內(nèi)容在下次計時器生效之前可能會發(fā)生變化。

這里提到的chunk()函數(shù),只是優(yōu)化循環(huán)性能的一個起點。你可以根據(jù)需要不斷改進(jìn)它,讓它擁有更多的功能。比如說,在數(shù)組中所有對象都處理完成以后,可以增加一個函數(shù)回調(diào)。無論你是否會按照這種方式對函數(shù)進(jìn)行修改,這只是一種JavaScript的代碼開發(fā)模式,可以幫助優(yōu)化數(shù)組的處理性能,還可以避免那個腳本失控的警告。

本文鏈接:http://www.95time.cn/tech/web/2009/6434.asp 

出處:七月佑安
責(zé)任編輯:bluehearts

◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。

相關(guān)文章 更多相關(guān)鏈接
JavaScript中盡量用局部變量的原因
JavaScript的2008
JavaScript Tween算法及緩動效果
仿Apple滑動條(拖動)產(chǎn)品展示效果
如何走出JavaScript初學(xué)困境
作者文章
瀏覽器根據(jù)什么來判定腳本失控?
JavaScript中盡量用局部變量的原因
JavaScript的2008
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計比賽 網(wǎng)頁制作 web標(biāo)準(zhǔn) 用戶體驗 UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點最新 站點最新列表
周大!熬•自然”設(shè)計大賽開啟
國際體驗設(shè)計大會7月將在京舉行
中國國防科技信息中心標(biāo)志征集
云計算如何讓安全問題可控
云計算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機(jī)會
阿里行云
云手機(jī)年終巨獻(xiàn),送禮標(biāo)配299起
阿里巴巴CTO王堅的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機(jī)主題設(shè)計大賽
欄目最新 欄目最新列表
淺談JavaScript編程語言的編碼規(guī)范
如何在illustrator中繪制臺歷
Ps簡單繪制一個可愛的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡單的作品展示頁面
CSS定位機(jī)制之一:普通流
25個最佳最閃亮的Eclipse開發(fā)項目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule

藍(lán)色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點的原創(chuàng)文章,但原作者和來自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請不要盜鏈到本站,且不準(zhǔn)打上各自站點的水印,亦不能抹去我站點水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計作品,如需使用,請與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請與我們聯(lián)系,我們將立即刪除修改。

您的評論
用戶名:  口令:
說明:輸入正確的用戶名和密碼才能參與評論。如果您不是本站會員,你可以注冊 為本站會員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯誤,請用報告錯誤,以利文檔及時修改。
不評分 1 2 3 4 5
注意:請不要在評論中含與內(nèi)容無關(guān)的廣告鏈接,違者封ID
請您注意:
·不良評論請用報告管理員,以利管理員及時刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國的各項有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評論管理人員有權(quán)保留或刪除其管轄評論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評論文檔 | 報告錯誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計之道
《Flex 4.0 RIA開發(fā)寶典》
《贏在設(shè)計》
犀利開發(fā)—jQuery內(nèi)核詳解與實踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2