具有命名空间的JavaScript匿名函数的优点

时间:2011-11-17 20:55:50

标签: javascript

编写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;
}

我已经看到第一个模式在几个库中实现,并试图找出如果有任何额外的好处,除非在第一个例子中的匿名函数内部声明了某种其他函数。

4 个答案:

答案 0 :(得分:11)

问题:

是的,存在差异(和利益)。在第一个示例中,您可以控制访问控制(意味着使用基于原型的公共/私有成员变量和函数版本)。举个例子:

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

http://jsfiddle.net/dbrecht/EQ4Tb/

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

对于简单的情况,你已经证明了立即执行的匿名函数根本没有任何优势。

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

另请注意,将var语句放在if中是没有意义的,因为声明(但不是赋值)会从块中“提升”。

答案 3 :(得分:0)

是的,私有变量。

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;
}