这两种命名空间方法有什么区别?

时间:2012-02-13 16:44:38

标签: javascript coding-style namespaces

我的代码目录中有第一个文件,如下所示

myNamespace.js

var myNamespace = {};

然后我的后续文件可以看作以下两种方式之一。

第一

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

第二

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

那么这两种方法有什么区别?两者似乎都适合我。是否有更普遍接受的惯例?

对不起,还是javascript的新手

2 个答案:

答案 0 :(得分:3)

您的第一个方法无效。它会在DoStuff上创建global object(最有可能window)。您需要将this替换为ns,在您这样做之后,两种方法之间没有区别。

前者将有一个冒险,你可以将所有与应用程序/文件相关的东西关闭到外部自我调用闭包函数中。所以你不会破坏全局命名空间。

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

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

答案 1 :(得分:2)

您的第一个错误,您已使用this,我非常确定您的意思是ns

ns.DoStuff = function() {
};

除此之外,你的第一种方法往往更好,因为你已经为自己创建了一个很好的小范围功能,它允许你拥有你在命名空间上创建的所有公共方法的私有数据和函数,使它们成为全局的。 E.g:

(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的函数有一个正确的名称,这可以在我调试代码时帮助我。但是这个名称不会污染全局命名空间,这有助于我保持理智并避免与其他代码发生冲突。