2012-04-23 196 views
2

簡短問題:JavaScript中的變量範圍

假設我們包含了jQuery。將這個函數執行得更快......

var example1 = (function($, jQuery) { 
    return function() { 
     // do something 
    } 
})() 

...比下面的例子:

var example2 = (function() { 
    return function() { 
     // do something 
    } 
})() 

在第一個jQuery對象將是undefined,在第二個它將被繼承。所以第二個應該更貴?

提高速度和擺脫繼承變量會降低性能的最佳方法是什麼?

jsPerf測試:http://jsperf.com/objinheritance

+1

這可能會回答你的問題:http://stackoverflow.com/questions/9248963/javascript-why-the-access-to-closure-variable-might-be-slow – 2012-04-23 08:37:22

+0

在第二個它不會被繼承,會嗎?它只是全球性的。就像第一個一樣。如果你在本地訪問它,它只是未定義的,你仍然有window。$和window.jQuery。 – 2012-04-23 08:45:20

+1

Quote:「過早優化是萬惡的根源」。繼續學習JS中的範圍,非常好 - 但不要爲了優化而優化。這個特定問題只有在一段代碼執行數千次(一次)時纔有意義。谷歌關鍵字:「scope-chain」。電腦(CPU)的時間比開發者時間便宜很多! – 2012-04-23 08:49:54

回答

3

作爲ECMAScript的定義,參考分辨率是一個內部至外查找過程,所以在第一示例中,$變量是1步驟從您的代碼,並在第二個示例,雖然$駐留在全局範圍內,但至少有兩個步驟以外,這會導致額外的查找開銷。然而,在現實世界中,現代JavaScript引擎(例如V8)並沒有像ECMAScript那樣實現參考分辨率完全相同的方式,他們有一個方法到flatten範圍鏈,換句話說,對於大多數代碼中,所有變量都可以在中參考一步,根本沒有查找開銷

結論:他們彼此真的是一樣的。

PS:還有作用域鏈,JavaScript引擎對原型鏈完全一樣的優化,所以也沒有必要擔心屬性查找開銷。