Javascript 什么';这两种名称空间方法的区别是什么?

Javascript 什么';这两种名称空间方法的区别是什么?,javascript,coding-style,namespaces,Javascript,Coding Style,Namespaces,我的代码目录中的第一个文件如下 myNamespace.js var myNamespace = {}; 然后,我的后续文件可以看作以下两种方式之一 首先 (function (ns) { ns.DoStuff = function(){ // do stuff } })(myNamespace); 秒 myNamespace.DoStuff = function(){ //do stuff } 那么这两种方法的区别是什么呢?这两个似乎都适合我。是否

我的代码目录中的第一个文件如下

myNamespace.js

var myNamespace = {};
然后,我的后续文件可以看作以下两种方式之一

首先

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

myNamespace.DoStuff = function(){
    //do stuff
}
那么这两种方法的区别是什么呢?这两个似乎都适合我。是否有一个更为普遍接受的惯例


很抱歉,您的第一个方法仍然是javascript新手,无法使用。它将在
全局对象上创建
DoStuff
(很可能是
窗口
)。您需要将
替换为
ns
,之后,这两种方法没有区别

前者的优点是,您可以将所有与应用程序/文件相关的内容关闭到外部的自调用关闭函数中。这样就不会破坏全局名称空间

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

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

您在第一个中有一个错误,您使用了
这个
,我很确定您的意思是
ns

ns.DoStuff = function() {
};
撇开这一点不谈,您的第一种方法会更好,因为您已经为自己创建了一个很好的小范围函数,它允许您将私有数据和函数提供给您在命名空间上创建的所有公共方法,而无需使它们成为全局的。例如:

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

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

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

现在,我分配给
myNamespace.DoStuff
的函数有了一个合适的名称,这在调试代码时对我很有帮助。但该名称不会污染全局名称空间,这有助于我保持理智,避免与其他代码冲突。

太棒了,谢谢。我根据这个错误编辑了我的问题。。。你的编辑对我来说有点复杂:(-你真的是指
myNamespace$DoStuff
?这个名称中的
$
符号代表什么?@ChaseFlorell:这个名称可以是你想要的任何东西--
myNamespace$DoStuff
myNamespace\u DoStuff
fred
,任何你想在调试器中的调用堆栈上看到的东西。:-)
$
并不重要,它只是标识符的一个有效字符。在我自己的工作中,我使用了最初加上封顶的“名称空间”(通常是
Nifty
),并对成为构造函数创建的实例属性的函数使用约定
$
,对将直接位于命名空间上的函数使用约定
\
。(我在上面应用了错误的一个!)在仍然使用此方法的情况下,如何使变量在全局范围内可用?@ChaseFlorell:实际上你不想这样做。在Javascript中,将内容写入全局对象是最糟糕/最危险的事情之一。但是,你始终可以从任何地方直接访问
window.XXX=42;
。谢谢,我将在9月发布一个更详细的问题这是我的答案。
(function(ns) {
    ns.DoStuff = Namespace$DoStuff;
    function Namespace$DoStuff() {
    }
})(myNamespace);