var module = (function (module) {
module.prototype.something_else = function () {
};
return module;
})(module);
为什么var module =
部分存在?为什么return module;
如果不需要前一部分呢?
我看到了:
的用法var module = (function(module) {...})(module || {});
对于有时候module
尚未定义的情况......是否是上述情况?
答案 0 :(得分:3)
此代码块仅在模块已定义并且您想要扩展它时使用(例如,添加新方法):
var module = (function (module) {
module.prototype.something_else = function () {
};
return module;
})(module);
它接受module
作为输入参数并返回扩展的module
。然后,var module =
的分配将替换原始module
。
逐一回答您的问题:
为什么var module = part存在?
在上面的示例中(取自您的第一个网址),不需要var module =
。他们提供的简单例子很愚蠢。你可以完成同样的事情:
module.prototype.something_else = function () {};
使用上面的模式扩展一个类对第二个URL(http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html)中提供的示例更有意义:
var MODULE = (function (my) {
var old_moduleMethod = my.moduleMethod;
my.moduleMethod = function () {
// method override, has access to old through old_moduleMethod...
};
return my;
}(MODULE));
立即执行功能创建一个新范围,我们可以保留旧方法var old_moduleMethod = my.moduleMethod;
下一个问题:
为什么返回模块;如果不需要前一部分?
您需要return module
,否则函数不会返回任何内容,而var module =
赋值将设置为未定义的值。
下一个问题:
对于模块有时尚未定义的情况......是否是上述情况?
是的,就是这样。如果未定义module
,则需要传入一个空对象。但是,如果没有首先定义对象,通常会使用模式来扩展对象。这没有任何意义,只会使你的代码复杂化。
答案 1 :(得分:1)
要理解,重命名标识符以获得等效的
会有所帮助var module = (function (module_impl) {
module_impl.prototype.something_else = function () {
};
return module_impl;
})(module || {});
module_impl
是保存模块的公共API的对象。因此,在填充之后,匿名函数会将其返回给调用者,调用者将其分配给全局module
。这样,API现在可以使用module
,而任何实现细节都隐藏在由匿名函数创建的闭包中。
module || {}
现在是允许扩充:第一次调用它时,module
仍然是undefined
,因为尚未发生对匿名函数返回值的赋值。因此`模块|| {}计算到第二个操作数。
进一步说明为什么需要分配。第一次调用存根,它实际上与
相同var module = (function () {
var module_impl = {};
// ...
return module_impl;
})());