JavaScript匿名函数和命名空间的好处

6

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

我看到第一种模式在几个库中都得到了实现,但是我想知道除非在第一个示例的匿名函数内声明某种其他函数,否则是否有任何附加好处。


是的,基本上就是这样。如果你需要在 MyClass 的外部作用域中使用一个变量或函数,但又不想让它成为全局变量,那么可以这样做。 - John Kalberer
4个回答

12

针对您的问题:

是的,这里存在差异(并且有好处)。在您的第一个示例中,您可以控制访问权限(意思是使用基于原型的公共/私有成员变量和函数版本)。例如:

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

2
我更喜欢这个变量 MyNamespace = MyNamespace || {}; ...谢谢! - jcreamer898
另外,您能否在您的回答中添加一个简短的代码示例,以便我更好地理解?仍然有点困惑 :) - jcreamer898
很好,我喜欢它,再次感谢! - jcreamer898
他的代码基本上创建了一个临时作用域,摆脱了它不返回的变量。那些变量在匿名函数外部无法被访问。 - Stephen
@jcreamer898: 我添加了一个稍微复杂的示例和一个 jsfiddle 链接,展示了一个更加深入的用例。 - Demian Brecht
我希望你不介意我开始问一个关于你的“离题”问题的问题。 - puk

0

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


0
对于你展示的简单情况,立即执行的匿名函数根本没有提供任何优势。但是,你可以在匿名函数的作用域内声明变量或其他函数,并且它们将有效地成为 MyClass 函数的私有部分。这是一个巨大的优势,即使你现在不需要私有变量,以后可能也需要,因此你仍然可以使用匿名函数... 另请注意,在 if 语句中放置 var 声明有点无意义,因为声明(但不是赋值)被“提升”出代码块。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接