1

What is the difference between

var module = (function(){
    return {} 
})()

and

(function(context){
    var module = {}
    context.module = module;
})(this)
4

2 回答 2

3

的属性this不等同于变量。在全局范围内(即 where thisreferences window),它们是相似的。然而,例如,当您尝试它们时,它们会有不同的行为delete

> this.module = {};
> delete this.module
true
> var module = {};
// cant be deleted

除此之外,两个片段都创建了一个空对象,包裹在一个闭包中,您可以在其中定义局部(私有)变量/函数等。在第二个函数中,该对象也被分配给局部变量module,但这可以在第一个中完成一个也是。


@Eric:您使用newoperator的方法与第一个关于变量的方法相似。但是,它将创建该匿名函数的实例,而不是返回普通对象。它将从自定义原型继承属性,例如module.constructor,然后将指向匿名函数(它不能被垃圾收集,但例如甚至可以重用于创建克隆)。我不建议使用这个。

于 2012-08-26T17:48:22.380 回答
0

第一个是显示模块模式。它允许您定义私有函数(尽可能多地在 javascript 中)并选择通过返回调用公开哪些函数。

var module = (function(){ 
    function foo() {}; // Public, since it's returned

    function bar() {}; // Private, since it is not returned

    return {
        foo: foo
    } 
})();

据我所知,最下面的只是将一个对象字面量分配给另一个对象的命名空间。这可能是单例模式的开始。

(function(context){
    var module = {};
    context.module = module;
}(this)

该模块实际上可以用显示模块模式定义,很难说,因为在您的示例中它只是一个对象文字。

于 2012-08-26T17:48:43.023 回答