資源描述:
《編寫高效的JavaScript程序.docx》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、JavaScript引擎包括GoogleV8(Chrome,Node)都是專為快速執(zhí)行大型JavaScript程序而設(shè)計的。在開發(fā)過程中,如果你在乎內(nèi)存使用率和性能情況,那么你應(yīng)該會關(guān)心在用戶的瀏覽器中JavaScript引擎背后是怎么樣的。無論是V8、SpiderMonkey(Firefox)、Carakan(Opera)、Chakra(IE)還是其他,有了它們可以幫助你更好的優(yōu)化應(yīng)用程序?! ∥覀儜?yīng)該時不時地詢問自己:·我還能做些什么使代碼更加有效?·主流的JavaScript引擎做了哪些優(yōu)化?·什么是引擎無法優(yōu)化的,我能
2、期待利用垃圾回收進行清潔嗎?? 快速的加載Web網(wǎng)頁就如同汽車一樣,需要使用特殊工具?! ‘?dāng)涉及到編寫高效的內(nèi)存和快速創(chuàng)建代碼時總會出現(xiàn)一些常見的弊端,在這篇文章中我們將探索高效編寫代碼的測試驗證方法?! ∫弧avaScript如何在V8中工作? 如果你對JS引擎沒有較深的了解,開發(fā)一個大型Web應(yīng)用也沒啥問題,就好比會開車的人也只是看過引擎蓋而沒有看過車蓋內(nèi)的引擎一樣(這里將Web網(wǎng)頁比如成汽車)。Chrome瀏覽器是我的優(yōu)先選擇,這里我將談下V8的核心組件:·一個基本的編譯器,在代碼執(zhí)行前分析JavaScript、生
3、成本地機器代碼而非執(zhí)行字節(jié)代碼或是簡單的解釋,該段代碼之初不是高度優(yōu)化的。·V8用對象模型“表述”對象。在JavaScript中,對象是一個關(guān)聯(lián)數(shù)組,但是V8中,對象被“表述”為隱藏類,這種隱藏類是V8的內(nèi)部類型,用于優(yōu)化后的查找?!み\行時分析器監(jiān)視正在運行的系統(tǒng)并優(yōu)化“hot”(活躍)函數(shù)。(比如,終結(jié)運行已久的代碼)·通過運行時分析器把優(yōu)化編譯器重新編譯和被運行時分析器標(biāo)識為“hot”的代碼,這是一種有效的編譯優(yōu)化技術(shù),(例如用被調(diào)用者的主體替換函數(shù)調(diào)用的位置)?!8支持去優(yōu)化,也就是說當(dāng)你發(fā)現(xiàn)一些假設(shè)的優(yōu)化代碼太過樂觀
4、,優(yōu)化編譯器可以退出已生成的代碼?!だ厥?,了解它是如何工作的,如同優(yōu)化JavaScript一樣同等重要?! 《⒗厥铡 ±厥帐莾?nèi)存管理的一種形式,它試圖通過將不再使用的對象修復(fù)從而釋放內(nèi)存占用率。垃圾回收語言(比如JavaScript)是指在JavaScript這種垃圾回收語言中,應(yīng)用程序中仍在被引用的對象不會被清除。手動消除對象引用在大多數(shù)情況下是沒有必要的。通過簡單地把變量放在需要它們的地方(理想情況下,盡可能是局部作用域,即它們被使用的函數(shù)里而不是函數(shù)外層),一切將運作地很好?! ±厥涨宄齼?nèi)存 在Jav
5、aScript中強制執(zhí)行垃圾回收是不可取的,當(dāng)然,你也不會想這么做,因為垃圾回收進程被運行時控制著,它知道什么時候才是適合清理代碼的最好時機?! ?.“消除引用”的誤解(De-ReferencingMisconceptions) 在JavaScript中回收內(nèi)存在網(wǎng)上引發(fā)了許多爭論,雖然它可以被用來刪除對象(map)中的屬性(key),但有部分開發(fā)者認(rèn)為它可以用來強制“消除引用”。建議盡可能避免使用delete,在下面的例子中deleteo.x的弊大于利,因為它改變了o的隱藏類,使它成為通用的慢對象。varo={x:1};d
6、eleteo.x;//trueo.x;//undefined 目的是為了在運行時避免修改活躍對象的結(jié)構(gòu),JavaScript引擎可以刪除類似“hot”對象,并試圖對其進行優(yōu)化。如果該對象的結(jié)果沒有太大改變,超過生命周期,刪除可能會導(dǎo)致其改變?! τ趎ull是如何工作也是有誤解的。將一個對象引用設(shè)置為null,并沒有使對象變“空”,只是將它的引用設(shè)置為空而已。使用o.x=null比使用delete會更好些,但可能也不是很必要。varo={x:1};o=null;o;//nullo.x//TypeError 如果這個引用是最
7、后一個引用對象,那么該對象可進行垃圾回收;倘若不是,那么此方法不可行。注意,無論您的網(wǎng)頁打開多久,全局變量不能被垃圾回收清理。varmyGlobalNamespace={}; 當(dāng)你刷新新頁面時,或?qū)Ш降讲煌捻撁?,關(guān)閉標(biāo)簽頁或是退出瀏覽器,才可進行全局清理;當(dāng)作用域不存在這個函數(shù)作用域變量時,這個變量才會被清理,即該函數(shù)被退出或是沒有被調(diào)用時,變量才能被清理?! 〗?jīng)驗法則: 為了給垃圾回收創(chuàng)造機會,盡可能早的收集對象,盡量不要隱藏不使用的對象。這一點主要是自動發(fā)生,這里有幾點需要謹(jǐn)記:1.正如之前我們提到的,手動引用在合適
8、的范圍內(nèi)使用變量是個更好的選擇,而不是將全局變量清空,只需使用不再需要的局部函數(shù)變量。也就是說我們不要為清潔代碼而擔(dān)心。2.確保移除不再需要的事件偵聽器,尤其是當(dāng)DOM對象將要被移除時。3.如果你正在使用本地數(shù)據(jù)緩存,請務(wù)必清潔該緩存或使用老化機制來避免存儲那些不再使用的大量