JavaScript:模块模式差异
JavaScript: module pattern differences
之间有什么区别
var module = (function(){
return {}
})()
和
(function(context){
var module = {}
context.module = module;
})(this)
this
的属性不等价于变量。在全局范围内(即this
引用window
),它们是相似的。然而,例如,当你尝试delete
他们时,他们会有不同的行为:
> this.module = {};
> delete this.module
true
> var module = {};
// cant be deleted
除此之外,这两个片段都创建了一个空对象,封装在一个闭包中,您可以在其中定义局部(私有)变量/函数等。在第二个函数中,该对象也被分配给局部变量module
,但这也可以在第一个函数中完成。
@Eric:您使用new
运算符的方法与第一个关于变量的方法类似。但是,它将创建该匿名函数的一个实例,而不是返回一个普通对象。它将继承来自自定义原型的属性,因此例如module.constructor
将指向匿名函数(该函数不能被垃圾收集,但例如甚至可以重用以创建克隆)。我不建议使用这个。
最重要的是揭示模块模式。它允许您定义私有函数(尽可能多地使用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)
模块实际上可以用揭示模块模式来定义,这很难说,因为在您的示例中,它只是一个对象文字。
相关文章:
- Javascript,访问一个主要对象模块模式中的每个对象
- 模块模式和这个
- 显示模块模式在Knockout中设置模型的新实例
- Javascript中的模块模式和揭示模块模式是否仅在创建API时有用;s
- 用于多个选项卡和模块化的knockoutjs设计模式
- JavaScript模块模式-如何在使用对象/函数之前激发构造函数/init函数
- TypeScript代码类似于揭示模块模式结构
- 为什么在javascript中的模块模式中实现Lazy函数时范围会发生变化
- JavaScript:模块模式差异
- 显示模块模式中的私有成员
- 如何将window.setTimeout与javascript和模块模式一起使用
- j查询模块模式未命名 |如何访问“$”
- 挖空和显示模块模式的数据绑定问题
- 传递参数时如何避免模块模式中的 getter/setter 函数
- 将变量传递给 Javascript 模块化模式方法
- JavaScript 模块模式给出了意想不到的结果
- 从模块模式开始
- 试图通过模块模式在DOM元素上实现change()事件
- 揭示模块模式、KnockoutJS和CoffeeScript
- JavaScript 设计模式:模块模式和揭示模块模式之间的区别