使用名称空间的JavaScript匿名函数的好处

使用名称空间的JavaScript匿名函数的好处,javascript,Javascript,在编写这个类的JavaScript类和名称空间时有什么好处吗 if(typeof MyNamespace === 'undefined'){ var MyNamespace = {}; } (function(){ MyNamespace.MyClass = function(){ this.property = 'foo' return this; } }()); 与此相比 if(typeof MyNamespace === 'undefined'){ v

在编写这个类的JavaScript类和名称空间时有什么好处吗

if(typeof MyNamespace === 'undefined'){
    var MyNamespace = {};
}

(function(){
MyNamespace.MyClass = function(){
    this.property = 'foo'

    return this;
}
}());
与此相比

if(typeof MyNamespace === 'undefined'){
    var MyNamespace = {};
}

MyNamespace.MyClass = function(){
    this.property = 'foo'

    return this;
}
我已经在一些库中看到了第一个模式的实现,并试图找出是否有任何额外的好处,除非在第一个示例中的匿名函数中声明了某种其他函数。

对于您的问题:

是的,有区别(和好处)。在第一个示例中,您可以控制访问控制(意味着使用基于原型的公共/私有成员变量和函数版本)。例如:

var m = (function() {
    var o = {};
    o.myPublicProperty = 0; // can be accessed by instantiated object's calling code

    var myPrivateProperty = 1; // can't be accessed outside of this module

    o.myPublicFunction = function() {
        myPrivateFunction();
        return myPrivateProperty;
    };

    function myPrivateFunction() {
        ++myPrivateProperty;
        ++o.myPublicProperty;
    }

    o.getMyPrivateProperty = function() {
        return myPrivateProperty;
    }

    return o;
})();

console.log(m.myPublicProperty);       // 0
console.log(m.getMyPrivateProperty()); // 1
console.log(m.myPrivateProperty);      // undefined
console.log(m.myPublicFunction());     // increments
console.log(m.myPublicProperty);       // 1
console.log(m.getMyPrivateProperty()); // 2

有点离题,但这对我来说有点奇怪:

if(typeof MyNamespace === 'undefined'){
    var MyNamespace = {};
}

为什么不直接使用:
var MyNamespace=MyNamespace | |{}

我不完全确定其他好处,但匿名函数中声明的所有内容都将保留在该范围内,即它不在全局范围内声明。这可能会有好处。

对于您所展示的简单情况,立即执行的匿名函数根本没有任何优势

但是,您可以在匿名函数的作用域内声明变量或其他函数,它们实际上是MyClass函数的私有函数。这是一个巨大的优势,即使你现在不需要私有变量,你以后也可以使用匿名函数


还要注意的是,将var语句放在if中是毫无意义的,因为声明(而不是赋值)被“提升”出块。

是的,私有变量

var MyNamespace = MyNamespace || {};

(function(){

    var priv_var = 'bar';

    MyNamespace.MyClass = function(){
        this.property = 'foo';

        //priv_var is accessible in here

        return this;
    }

}());
与:

var MyNamespace = MyNamespace || {};

var priv_var = 'bar';

MyNamespace.MyClass = function(){
    this.property = 'foo';

    //priv_var is accessible anywhere

    return this;
}

是的,差不多就是这样。如果在MyClass的外部范围中需要一个变量或函数,而您不希望它是全局的;好多了…谢谢!另外,请您在回答中添加一个简短的代码示例,说明您的意思…仍然有点困惑:)很好…我喜欢它…再次感谢!他的代码基本上是创建一个临时作用域,该作用域除去它不返回的变量。在anon fn之外无法访问这些变量。@jStreamer898:我添加了一个更复杂的示例和一个JSFIDLE链接,以显示更复杂的用例。