2010-06-21 281 views
2

我更願意爲我的所有網站聲明一個Javascript文件。我正試圖減少全局變量的使用。我在下面的例子,在這兩種情況下,每個對象都有一個myName字段。Javascript全局變量或對象變量

  1. 我想知道它們何時初始化?
  2. 而在內存和效率方面哪一個更有效?
  3. 對於變量a,聲明a.myName與全局「var myName = Rebecca」相同?
var a = { 
    myName : 'Rebecca' , 

    sayHello : function() { 
     console.log(this.myName); 
    } 
}; 

var b = { 
    myName : function() { 
     return 'Rebecca'; 
    }, 

    sayHello : function() { 
     console.log(this.myName()); 
    } 
}; 

感謝

回答

0
  1. 我相信這些將被初始化相同(即達到代碼時)。不同之處在於它們在初始化時發生了什麼,以及實際需要數據時的負載放置位置。

  2. 對我來說,這將取決於你期望在myName中有什麼。如果它只是一個字符串,我會避免該功能,並選擇一個。另一方面,如果涉及到大量的邏輯,並且可能不需要調用邏輯(例如,如果只有在用戶單擊某個按鈕或應用程序達到某個狀態時才執行該邏輯),則I' d去選擇b。據我瞭解,該函數消耗內存,不會收集垃圾(這是一個減號),但它也不會消耗CPU資源,直到它真正需要(這可能是一個巨大的優勢)。

  3. 我不確定我是否理解這個問題,但我會說這是不一樣的。如果a的唯一成員是myName那麼這兩者是等同的(兩者都佔用全局命名空間。但是,如果你有多個屬性,節省變得明顯。從你的例子來看,我認爲你明白這一點很明顯,所以我可能不會理解這個問題。

+0

實際上,我準備在需要這些變量時使用我的內存和cpu。我只是想懶加載我的字符串變量。 – Cemo 2010-06-21 14:50:08

+0

我是懶惰加載的狂熱粉絲,但據我所知,如果你想放棄大的「資源分配」(內存使用,CPU使用和/或執行時間),延遲加載只會有所幫助。使用一個只返回字符串的函數('「Rebecca」')將使用更多的內存,解析需要更長的時間,並且比使用直接字符串文本需要更長的時間。還有多少?那麼,可能非常非常少。我只是不會稱之爲最佳做法。 – Andrew 2010-06-21 14:57:33

+0

也許你在開始的時候注意到了我的先決條件。我想爲我的所有網站只使用一個JavaScript文件。在所有其他頁面加載這些變量對我來說沒有意義。這就是爲什麼我開始考慮另一種選擇。 如何將這些數據存儲在某些變量中?緩存不是一個簡單的解決方案? – Cemo 2010-06-21 15:51:37

0

首先遇到的語句時,它們將被初始化。在a中,'Rebecca'被初始化爲myName密鑰的值。在b中,它只是myName(匿名)函數的內部數據。 a會稍微高效,因爲它避免了函數調用。在這個簡單的例子中,我也發現它更具可讀性。

我發現選擇將所有內容放在單個文件中是有問題的。在某些情況下,您需要模塊化設計。而且,由於您擔心效率(儘管可能過早),請注意,如果頁面包含不需要的代碼,擁有一個大文件實際上可能會損害性能。

-1

a沒有任何意義,因爲您正在記錄函數引用。 B是要走的路,因爲實際上是使用()調用方法。

0

1)在腳本在瀏覽器中處理時,它們會被初始化,除非您在事件處理程序中聲明對象。在這種情況下,該對象是在事件腳本執行時創建的。

2)就效率而言,a可能會更有效率。但請注意,在第一種情況下,您使用a.myName並在第二種情況下使用b.myName()來獲取該房產的價值。

3)不可以。如果您爲某個對象的某個屬性賦值,則必須始終通過該對象獲取該值。在這種情況下,要麼是a.myName要麼是a['myName']

+0

a.myName與a.myName():前者可隨時更改,後者將始終返回「Rebecca」。 – Dormilich 2010-06-21 15:43:15

+0

'a.MyName'也可以改變。 'a.myName = function(){return「Deborah」; };' – 2010-06-21 16:47:05