Nicholas Zakas是一位 JS 大師,Yahoo! 首頁的前端主程。他是《高性能 Javascript》的作者,這本書值得每個程序員去閱讀。
當談到 JS 性能的時候,Zakas差不多就是你要找的,2010年六月他在Google Tech Talk發(fā)表了名為《Speed Up Your Javascript》的演講。
但 Javascript 性能優(yōu)化絕不是一種書面的技術(shù),Nicholas 的技術(shù)演進列出了10條建議,幫助你寫出高效的 JS 代碼。
1. 定義局部變量
當一個變量被引用的時候,JavaScript將在作用域鏈中的不同成員中查找這個變量。作用域鏈指的是當前作用于下可用變量的集合,它在各種主流瀏覽器中至少包含兩個部分:局部變量的集合和全局變量的集合。
簡單地說,如果JavaScript引擎在作用域鏈中搜索的深度越大,那么操作也就會消耗更多的時間。引擎首先從 this 開始查找局部變量,然后是函數(shù)參數(shù)、本地定義的變量,最后遍歷所有的全局變量。
因為局部變量在這條鏈的起端,所以查找局部變量總是比查找全局變量要塊。所以當你想要不止一次地使用一個全局變量的時候,你應(yīng)該將它定義成局部變量,就像這樣:
var blah = document.getElementById('myID'),blah2 = document.getElementById('myID2');改寫成
var doc = document,blah = doc.getElementById('myID'),blah2 = doc.getElementById('myID2');2. 不要使用 with() 語句
這是因為 with() 語句將會在作用域鏈的開始添加額外的變量。額外的變量意味著,當任何變量需要被訪問的時候,JavaScript引擎都需要先掃描with()語句產(chǎn)生的變量,然后才是局部變量,最后是全局變量。
So with() essentially gives local variables all the performance drawbacks of global ones, and in turn derails Javascript optimization. 因此with()語句同時給局部變量和全局變量的性能帶來負面影響,最終使我們優(yōu)化JavaScript性能的計劃破產(chǎn)。
3. 小心使用閉包
雖然你可能還不知道“閉包”,但你可能在不經(jīng)意間經(jīng)常使用這項技術(shù)。閉包基本上被認為是JavaScript中的new,當我們定義一個即時函數(shù)的時候,我們就使用了閉包,比如:
document.getElementById('foo').onclick = function(ev) { };
閉包的問題在于:根據(jù)定義,在它們的作用域鏈中至少有三個對象:閉包變量、局部變量和全局變量。這些額外的對象將會導(dǎo)致第1和第2個建議中提到的性能問題。
但是我認為Nicholas并不是要我們因噎廢食,閉包對于提高代碼可讀性等方面還是非常有用的,只是不要濫用它們(尤其在循環(huán)中)。
4. 對象屬性和數(shù)組元素的速度都比變量慢
談到JavaScript的數(shù)據(jù),一般來說有4種訪問方式:數(shù)值、變量、對象屬性和數(shù)組元素。在考慮優(yōu)化時,數(shù)值和變量的性能差不多,并且速度顯著優(yōu)于對象屬性和數(shù)組元素。
新聞熱點
疑難解答
圖片精選