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

和上個(gè)測試一樣,Internet Explorer和Firefox還是最慢的,Opera表現(xiàn)了非常搶眼的性能,而同樣的,Chrome和最新版本的Webkit午夜版顯示了和作用域深度無關(guān)的性能趨勢,同樣需要注意的是,F(xiàn)irefox 3.1 Beta 2的變量訪問時(shí)間還是會(huì)伴隨著深度出現(xiàn)一個(gè)奇怪的跳躍。
在測試的過程中,我發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,就是Chrome在訪問全局變量的時(shí)候會(huì)有額外的性能損失。訪問全局變量的時(shí)間和作用域?qū)訑?shù)沒有關(guān)系,但是會(huì)比訪問同樣層數(shù)的局部變量的時(shí)間多出50%。
這兩個(gè)測試可以給我們帶來什么啟示呢?首先是驗(yàn)證了那個(gè)古老的觀點(diǎn),就是要盡可能的使用局部變量。在所有的瀏覽器下,訪問局部變量都比訪問跨作用域的變量要快,當(dāng)然也包括全局變量。下面這幾點(diǎn)應(yīng)該是通過這個(gè)測試得出的經(jīng)驗(yàn)吧:
1、仔細(xì)檢查函數(shù)中所有使用的變量,如果有一個(gè)變量不是當(dāng)前作用域定義的,而且使用了不止一次,那么我們就應(yīng)該把這個(gè)變量保存在局部變量中,而使用這個(gè)局部變量來進(jìn)行讀寫操作。這樣可以幫助我們將作用域外的變量的搜索深度減少到1.這對全局變量尤為重要,因?yàn)槿肿兞靠偸潜环诺阶饔糜蜴湹淖詈笪恢脕硭阉鳌?
2、避免使用with語句。因?yàn)樗鼤?huì)修改執(zhí)行上下文(Execution Context)的作用域鏈,在最前面添加一個(gè)對象(Variable Object)。這就意味著在執(zhí)行with的過程中,實(shí)際上的局部變量都被移到作用域鏈上的第二個(gè)位置,這會(huì)帶來性能上的損失。
3、如果你確定一段代碼肯定會(huì)拋出異常,那么就要避免使用try-catch,因?yàn)閏atch分支在作用域鏈上的處理方法和with是一樣的。但try分支的代碼是沒有性能損失的,所以還是建議用try-catch來捕獲那些不可預(yù)知的錯(cuò)誤。
如果你想圍繞這個(gè)話題展開更多的討論,我在上個(gè)月的 Mountain View JavaScript Meetup 中曾經(jīng)發(fā)表了一個(gè)小演講??梢栽赟lideShare上下載 幻燈片,或者觀看聚會(huì)的 完整視頻,我的演講大概從11分鐘左右時(shí)開始。
譯者筆記
大家如果在閱讀本文的過程中,有什么疑惑,建議延伸閱讀以下兩篇文章:
1、Richie寫的《JavaScript對象模型-執(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)站,需要翻墻才能訪問,住在California真幸福,有那么多的好活動(dòng)可以參加,呵呵。
相關(guān)文章
JS實(shí)現(xiàn)自定義狀態(tài)欄動(dòng)畫文字效果示例
這篇文章主要介紹了JS實(shí)現(xiàn)自定義狀態(tài)欄動(dòng)畫文字效果,涉及javascript結(jié)合時(shí)間函數(shù)動(dòng)態(tài)設(shè)置IE狀態(tài)欄文字顯示效果相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Javascript判斷文件是否存在(客戶端/服務(wù)器端)
這篇文章主要介紹了Javascript判斷文件是否存在的方法適用于客戶端、服務(wù)器端,遠(yuǎn)程文件,示例代碼如下,需要的朋友可以參考下2014-09-09
使用javascript函數(shù)編寫簡單銀行取錢存錢流程
本文通過實(shí)例代碼給大家講解了使用javascript函數(shù)編寫簡單銀行取錢存錢流程,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05
uniapp項(xiàng)目實(shí)踐之全局公共組件樣式及方法使用示例詳解
這篇文章主要為大家介紹了uniapp項(xiàng)目實(shí)踐之全局公共組件樣式及方法使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
微信小程序webview與h5通過postMessage實(shí)現(xiàn)實(shí)時(shí)通訊的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序webview與h5通過postMessage實(shí)現(xiàn)實(shí)時(shí)通訊的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
javascript實(shí)現(xiàn)貪吃蛇經(jīng)典游戲
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)貪吃蛇經(jīng)典游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
javascript實(shí)現(xiàn)評(píng)分功能
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)評(píng)分功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06

