之间有什么区别
var module = (function(){
return {}
})()
和
(function(context){
var module = {}
context.module = module;
})(this)
答案 0 :(得分:3)
this
的属性不等同于变量。在全局范围内(即this
引用window
),它们是相似的。然而,例如,当你尝试delete
时,他们会有不同的行为:
> this.module = {};
> delete this.module
true
> var module = {};
// cant be deleted
除此之外,两个片段都创建一个空对象,包装在一个闭包内,您可以在其中定义本地(私有)变量/函数等。在第二个函数中,该对象也被分配给局部变量module
,但这也可以在第一个中完成。
@Eric:使用new
operator的方法与第一个关于变量的方法类似。但是,它将创建该匿名函数的实例,而不是返回普通对象。它将从自定义原型继承属性,因此例如module.constructor
将指向匿名函数(不能进行垃圾收集,但例如甚至重用以创建克隆)。我不建议使用它。
答案 1 :(得分:0)
最重要的是揭示模块模式。它允许您定义私有函数(尽可能多地使用javascript)并选择通过回调函数公开的函数。
var module = (function(){
function foo() {}; // Public, since it's returned
function bar() {}; // Private, since it is not returned
return {
foo: foo
}
})();
据我所知,最低层只是将对象文字分配给另一个对象的命名空间。这可能是singelton模式的开始。
(function(context){
var module = {};
context.module = module;
}(this)
模块实际上可以用显示模块模式定义,很难说,因为在你的例子中它只是一个对象文字。