2012-02-13 170 views
2

如下這兩種命名空間方法有什麼區別?

myNamespace.js

var myNamespace = {}; 

然後我後面的文件可以看成以下兩種方式之一我已經得到了第一個文件在我的代碼目錄。

第一

(function (ns) { 
    ns.DoStuff = function(){ 
     // do stuff 
    } 
})(myNamespace); 

第二

myNamespace.DoStuff = function(){ 
    //do stuff 
} 

那麼究竟是什麼這兩種方法之間的區別?兩者似乎都適合我。是否有更普遍接受的慣例?

對不起,還是新的JavaScript

回答

2

您的第一個錯誤,你使用this,我敢肯定你的意思ns

ns.DoStuff = function() { 
}; 

離開那個放在一邊,你的第一種方法往往是更好,因爲您已經爲自己創建了一個很好的小範圍函數,它允許您爲您在名稱空間上創建的所有公共方法提供私有數據和函數,而無需使它們成爲全局變量。例如:

(function(ns) { 
    function privateFunction() { 
    } 

    ns.DoStuff = function() { 
     privateFunction(); // <=== works fine 
    }; 

})(myNamespace);] 
privateFunction(); // <=== doesn't work, because it's private 

我喜歡做這種方式部分原因是I have thing against anonymous functions,所以我不會如上定義DoStuff,而是這樣的:

(function(ns) { 
    ns.DoStuff = Namespace$DoStuff; 
    function Namespace$DoStuff() { 
    } 
})(myNamespace); 

現在我已經分配給功能myNamespace.DoStuff有一個正確的名字,當我調試我的代碼時,它可以幫助我解決問題。但是這個名字不會污染全局命名空間,這可以幫助我保持健全,避免與其他代碼發生衝突。

+0

太棒了,謝謝。我根據'this'錯誤編輯了我的問題。 – 2012-02-13 16:52:45

+0

呃哦...你的編輯對我來說有點複雜( - 你真的是指'myNamespace $ DoStuff'嗎?'$'符號代表那個名字嗎? – 2012-02-13 16:55:03

+0

@ChaseFlorell:名字可以是任何你想要的--'myNamespace $ DoStuff','myNamespace_DoStuff','fred',無論你想在調試器中的調用堆棧上看到什麼::-) $是不重要的,它只是標識符的有效字符。在我自己的工作中,我使用初始上限的「名稱空間」(通常是例如'Nifty'),並使用約定' $ <函數名>來獲得由構造函數創建的實例屬性的函數,並使用' _函數將直接位於命名空間上。 (並且我在上面應用了錯誤的!) – 2012-02-13 17:02:11

3

第一的做法是行不通的。它會在global object上創建DoStuff(最可能是window)。您需要將this替換爲ns,在這樣做之後,兩種方法之間沒有區別。

前者將有可能將所有與應用程序/文件相關的東西關閉到外部自我調用閉包函數中。所以你不會打破全局命名空間。

(function (ns) { 
    var foo = 10, 
     bar = 42; 

    ns.DoStuff = function(){ 
     console.log('foo is ', foo, ' and its not available globally'); 
    } 
})(myNamespace); 
+0

你說得對'這個'...我改變了它。 – 2012-02-13 16:52:00

+0

如何在仍使用此方法的情況下使全局變量可用? – 2012-02-13 16:56:05

+0

@ChaseFlorell:其實你不想那樣做。將東西寫入全局對象是Javascript中最糟糕/最危險的事情之一。但是,您可以隨時從任何地方直接訪問'window.XXX = 42;'。 – jAndy 2012-02-13 16:59:55

相關問題