[英]Memory usage for JavaScript object literal notation vs. constructor functions
[英]JavaScript Object Literal notation vs plain functions and performance implications?
假設我有以下功能:
function foo() {
}
function bar() {
}
我可以在上面寫為Object Literal表示法:
var Baz = {
foo: function() {
},
bar: function() {
}
};
據我所知,在后一種情況下,無論是否調用任何Baz函數,腳本加載時都會創建一個Baz實例。 在前一種情況下,僅在調用該函數時才創建函數對象。 我對這些假設是否正確?
如果我是正確的那么前者將具有比后者在很少調用這些函數的應用程序中更高的性能(更少的內存)。 但后者的優勢在於它提供了更大的模塊化和更低的全局命名空間污染。
您從專業經驗中對此有何看法? 有速度差嗎?
在前一種情況下,僅在調用該函數時才創建函數對象。
不,無論如何都會創建這些功能。
請注意,您也可以這樣做:
function foo() {
}
function bar() {
}
var Baz = {
foo: foo,
bar: bar
};
或這個:
var Baz = (function() {
function foo() {
}
function bar() {
}
return {
foo: foo,
bar: bar
};
})();
將函數放在Baz
作為屬性的主要目的是使它們在Baz
上作為“方法”使用。 這可能是為了方便,“命名空間”等。在您的第一個表單(以及我上面的第一個表單)中,如果該代碼位於全局范圍,則foo
和bar
將添加到全局范圍,這可能會非常快速地擁擠(尤其是在瀏覽器上)。 在第二個示例中,唯一的全局符號是Baz
因為函數是匿名的。 在上面的最后一個例子中,唯一的全局符號是Baz
但函數不是匿名的,它們有調試器和堆棧跟蹤可以顯示的名稱(這是一件好事; 更多信息 )。
在嘗試優化函數何時創建時,以下是它的工作原理:當執行進入給定的上下文 (全局上下文或與調用函數相關的上下文)時,這些事情就完成了:
arguments
的變量對象中(可用於訪問參數的類似數組的事物) var
聲明的每個變量,在變量對象上創建屬性; 它們的值最初是undefined
(無論var
上是否有初始值設定項)。 您將注意到函數聲明和函數表達式之間的差異。 您可以通過查看是否將結果用作右手值來判斷哪個是哪個 - 也就是說,您是將結果分配給變量,將其用作對象中屬性定義的右側文字,或將其傳遞給函數。 如果你是,那就是一個函數表達式 。 如果你不是,那就是一個功能聲明 。
函數聲明示例:
function foo() {
}
函數表達式示例:
var foo = function() {
};
另一個:
var Baz = {
foo: function() { }
};
( foo
行是對象文字中的屬性聲明,它使用函數表達式作為值。)
命名函數表達式示例:
var f = function foo() { // <== Don't do this (more below)
};
命名函數表達式應該是有效的,但它們在野外(特別是IE)中的實現很難得到支持,因此現在必須避免它們。 更多這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.