2010-05-24 20 views
4

在主流瀏覽器中,JavaScript中的局部變量(var v),全局變量(window.v)和跨全局變量(parent.v)有多貴?有沒有人對此進行過任何好的測試?JavaScript中的變量有多貴?

+0

昂貴的方面是什麼?性能?記憶?另外,變量*包含*是什麼?我確定一個包含單個整數的變量不是很貴,但是包含一個大數組的變量會更加...... – 2010-05-24 07:28:00

+5

每個$ 3.50(以美元計算)。 – paxdiablo 2010-05-24 07:28:56

+1

詛咒這種可變的通貨膨脹!我想我將不得不重用我的一些變量來省錢... – strager 2010-05-24 07:34:16

回答

8

忽略解釋器/解析器的優點和缺點,重要的是運行時需要查看部分作用域鏈的多少。

考慮一個簡單的例子:

foo = 42;   // implicitly window.foo; cost: 2 
var bar = 3;  // cost: 1 

function woot(a) { 
    a;   // cost: 1 
    bar;   // cost: 2 
    foo;   // cost: 3 

    var other = 9;// cost: 1 

    other;  // cost: 1 

    a.something; // cost: 2 
    foo.win.fail.arg.func(a.something).thing = 0; // cost: 8 + 2 
} 

woot(bar);  // cost: 2 + 1 

請記住,功能共享相同的命名空間的變量(我認爲)和行爲像至於分辨率變量。

使用foo['bar']而不是foo.bar,除了可能由Javscript引擎優化(儘管如果你優化後者,如果內容是字面值,應該很容易優化前者)應該不會有額外的成本。

+0

函數在這種意義上被視爲變量 - 它們都被添加到爲範圍創建的變量對象中。 – 2010-05-24 08:11:10

+0

@Sean Kisney,謝謝你的澄清。我知道Javascript的工作原理,但我沒有閱讀ECMAScript規範或任何東西。 – strager 2010-05-24 10:47:38

+0

不是我希望的答案,但非常有見地,我從未真正意識到全球變量的成本大約是本地成本的三倍。正如你所說,解析器可能也應該是不相關的,因爲它們現在每個月都在改進。 – Tom 2010-05-25 08:14:24

2

本地範圍變量將始終存在於本地變量對象上,因此將是'自由'。

要在範圍內達到全局變量,必須遍歷範圍鏈直到到達全局對象,它將在[[global]]變量對象中找到它。這裏的成本取決於鏈中的範圍數量。

當涉及訪問不同窗口中的變量時,現在這是一個不同的故事。
大多數較新的瀏覽器使用自己的線程和自己的堆棧來隔離每個窗口,以提高穩定性,改善垃圾回收,並避免一個Windows線程崩潰整個瀏覽器。
變量訪問的含義是一個窗口中的變量不能直接被另一個窗口訪問(在不同的棧上)。那麼如何解決?以Opera爲例,一旦一個窗口嘗試訪問另一個窗口變量,Opera實際上會暫停執行,將兩個棧和執行環境合併在一起,然後繼續執行。
我猜你可能會說這是很貴:) :)

+0

在網頁中從來沒有考慮過「IPC」;不錯的想法。 – strager 2010-05-24 10:48:40

+0

有趣的考慮。 – Tom 2010-05-25 08:15:16