javascript 用局部變量來(lái)代替全局變量第2/2頁(yè)
上面的結(jié)果是通過(guò)對(duì)變量執(zhí)行寫(xiě)操作而得出的,其實(shí)我很好奇,讀取變量時(shí)的情況會(huì)不會(huì)有什么不同,于是接著做了下面的測(cè)試。結(jié)果發(fā)現(xiàn),讀的速度要比寫(xiě)的速度快一些,但是性能變化的趨勢(shì)是一致的。

和上個(gè)測(cè)試一樣,Internet Explorer和Firefox還是最慢的,Opera表現(xiàn)了非常搶眼的性能,而同樣的,Chrome和最新版本的Webkit午夜版顯示了和作用域深度無(wú)關(guān)的性能趨勢(shì),同樣需要注意的是,F(xiàn)irefox 3.1 Beta 2的變量訪問(wèn)時(shí)間還是會(huì)伴隨著深度出現(xiàn)一個(gè)奇怪的跳躍。
在測(cè)試的過(guò)程中,我發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,就是Chrome在訪問(wèn)全局變量的時(shí)候會(huì)有額外的性能損失。訪問(wèn)全局變量的時(shí)間和作用域?qū)訑?shù)沒(méi)有關(guān)系,但是會(huì)比訪問(wèn)同樣層數(shù)的局部變量的時(shí)間多出50%。
這兩個(gè)測(cè)試可以給我們帶來(lái)什么啟示呢?首先是驗(yàn)證了那個(gè)古老的觀點(diǎn),就是要盡可能的使用局部變量。在所有的瀏覽器下,訪問(wèn)局部變量都比訪問(wèn)跨作用域的變量要快,當(dāng)然也包括全局變量。下面這幾點(diǎn)應(yīng)該是通過(guò)這個(gè)測(cè)試得出的經(jīng)驗(yàn)吧:
1、仔細(xì)檢查函數(shù)中所有使用的變量,如果有一個(gè)變量不是當(dāng)前作用域定義的,而且使用了不止一次,那么我們就應(yīng)該把這個(gè)變量保存在局部變量中,而使用這個(gè)局部變量來(lái)進(jìn)行讀寫(xiě)操作。這樣可以幫助我們將作用域外的變量的搜索深度減少到1.這對(duì)全局變量尤為重要,因?yàn)槿肿兞靠偸潜环诺阶饔糜蜴湹淖詈笪恢脕?lái)搜索。
2、避免使用with語(yǔ)句。因?yàn)樗鼤?huì)修改執(zhí)行上下文(Execution Context)的作用域鏈,在最前面添加一個(gè)對(duì)象(Variable Object)。這就意味著在執(zhí)行with的過(guò)程中,實(shí)際上的局部變量都被移到作用域鏈上的第二個(gè)位置,這會(huì)帶來(lái)性能上的損失。
3、如果你確定一段代碼肯定會(huì)拋出異常,那么就要避免使用try-catch,因?yàn)閏atch分支在作用域鏈上的處理方法和with是一樣的。但try分支的代碼是沒(méi)有性能損失的,所以還是建議用try-catch來(lái)捕獲那些不可預(yù)知的錯(cuò)誤。
如果你想圍繞這個(gè)話題展開(kāi)更多的討論,我在上個(gè)月的 Mountain View JavaScript Meetup 中曾經(jīng)發(fā)表了一個(gè)小演講??梢栽赟lideShare上下載 幻燈片,或者觀看聚會(huì)的 完整視頻,我的演講大概從11分鐘左右時(shí)開(kāi)始。
譯者筆記
大家如果在閱讀本文的過(guò)程中,有什么疑惑,建議延伸閱讀以下兩篇文章:
1、Richie寫(xiě)的《JavaScript對(duì)象模型-執(zhí)行模型》
2、《ECMA-262第三版》,主要看看第十章,就是執(zhí)行上下文(Execution Context)那張,本文提到的名詞在那里都有詳細(xì)的解釋。
在最后的時(shí)候,Nicholas提到一個(gè)Mountain View JavaScript Meetup,Meetup那個(gè)網(wǎng)站其實(shí)就是一個(gè)各種現(xiàn)實(shí)世界活動(dòng)的組織網(wǎng)站,需要翻墻才能訪問(wèn),住在California真幸福,有那么多的好活動(dòng)可以參加,呵呵。
相關(guān)文章
javascript代碼編寫(xiě)需要注意的7個(gè)小細(xì)節(jié)小結(jié)
每種語(yǔ)言都有它特別的地方,對(duì)于JavaScript來(lái)說(shuō),使用var就可以聲明任意類(lèi)型的變量,這門(mén)腳本語(yǔ)言看起來(lái)很簡(jiǎn)單,然而想要寫(xiě)出優(yōu)雅的代碼卻是需要不斷積累經(jīng)驗(yàn)的。本文利列舉了JavaScript初學(xué)者應(yīng)該注意的七個(gè)細(xì)節(jié),與大家分享。2011-09-09ES6 新增的創(chuàng)建數(shù)組的方法(小結(jié))
這篇文章主要介紹了ES6 新增的創(chuàng)建數(shù)組的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08javascript函數(shù)報(bào)Uncaught?ReferenceError:?XXX?is?not?define
本文主要介紹了javascript函數(shù)報(bào)Uncaught?ReferenceError:?XXX?is?not?defined,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07js中實(shí)現(xiàn)字符串和數(shù)組的相互轉(zhuǎn)化詳解
這篇文章主要介紹了js中實(shí)現(xiàn)字符串和數(shù)組的相互轉(zhuǎn)化,感興趣的小伙伴們可以參考一下2016-01-01