在主流瀏覽器中,JavaScript中的局部變量(var v
),全局變量(window.v
)和跨全局變量(parent.v
)有多貴?有沒有人對此進行過任何好的測試?JavaScript中的變量有多貴?
4
A
回答
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引擎優化(儘管如果你優化後者,如果內容是字面值,應該很容易優化前者)應該不會有額外的成本。
2
本地範圍變量將始終存在於本地變量對象上,因此將是'自由'。
要在範圍內達到全局變量,必須遍歷範圍鏈直到到達全局對象,它將在[[global]]變量對象中找到它。這裏的成本取決於鏈中的範圍數量。
當涉及訪問不同窗口中的變量時,現在這是一個不同的故事。
大多數較新的瀏覽器使用自己的線程和自己的堆棧來隔離每個窗口,以提高穩定性,改善垃圾回收,並避免一個Windows線程崩潰整個瀏覽器。
變量訪問的含義是一個窗口中的變量不能直接被另一個窗口訪問(在不同的棧上)。那麼如何解決?以Opera爲例,一旦一個窗口嘗試訪問另一個窗口變量,Opera實際上會暫停執行,將兩個棧和執行環境合併在一起,然後繼續執行。
我猜你可能會說這是挺很貴:) :)
相關問題
- 1. 創建大量Joda DateTime有多貴?
- 2. Thread.getStackTrace()有多昂貴?
- 3. CreateThread()有多昂貴?
- 4. javascript函數中有多個變量?
- 5. UITableView的reloadData有多昂貴?
- 6. 在Javascript中的權力操作有多昂貴?
- 7. 線程有多昂貴?
- 8. MySQL事件有多昂貴?
- 9. OWLOntologyManager.addAxioms()操作有多昂貴?
- 10. Django MPTT - objects.rebuild有多貴?
- 11. 打開手柄有多貴?
- 12. 靜態ArrayList有多昂貴?
- 13. Java鎖定有多昂貴?
- 14. SQL ORDER BY有多昂貴?
- 15. WaitHandle同步有多貴?
- 16. OpenGL操作有多昂貴?
- 17. Javascript中的「變量」變量?
- 18. 變量javascript中的變量
- 19. JavaScript中的變量變量?
- 20. 信號量與自旋鎖在實踐中有多昂貴?
- 21. 多個變量的JavaScript
- 22. 對JavaScript中多個變量的引用
- 23. 多個變量分配給Javascript中的一個變量?
- 24. 對java.util.HashMap.keySet()的調用有多昂貴?
- 25. XML的XSD驗證有多昂貴?
- 26. 的Javascript私有變量
- 27. javascript中的變量
- 28. javascript中的變量
- 29. Javascript函數多值變量
- 30. Javascript多變量賦值
昂貴的方面是什麼?性能?記憶?另外,變量*包含*是什麼?我確定一個包含單個整數的變量不是很貴,但是包含一個大數組的變量會更加...... – 2010-05-24 07:28:00
每個$ 3.50(以美元計算)。 – paxdiablo 2010-05-24 07:28:56
詛咒這種可變的通貨膨脹!我想我將不得不重用我的一些變量來省錢... – strager 2010-05-24 07:34:16