我一直关注this tutoral,当在ModuleTwo中引用Module作为参数时,一切正常直到我评论出模块。
我的理解是双管||如果未定义,则空对象{}将创建一个空对象来代替Module,而是在控制台中出现错误。
var Module = (function () {
var privateMethod = function () {
// private
};
var someMethod = function () {
// public
};
var anotherMethod = function () {
// public
};
return {
someMethod: someMethod,
anotherMethod: anotherMethod
};
})();
var ModuleTwo = (function (Module) {
Module.extension = function () {
// another method!
};
return Module;
})(Module || {});
答案 0 :(得分:2)
当您将定义第二个模块的函数应用于(Module || {})
时,如果Module
之前未声明Module
,则无法解析符号var ModuleTwo = (function(Module) {
...
})(typeof Module == 'object' ? Module : {} );
,这始终会提供JavaScript错误。如果您希望在没有第一个模块的情况下定义第二个模块,请尝试以下操作:
rowconfigure
答案 1 :(得分:2)
基本上,教程中存在错误。 rplantiko建议了一种让工作正常的方法,但是编写window.Module || {}
代替Module || {}
可能更容易。
这里的工作原理:
undefined
。但是,引用尚未声明的变量会产生ReferenceError
(因此您的理解有点偏离)。window
对象上。本教程中的Module
是一个全局变量,因为它在所有函数之外声明,因此您可以通过window.Module
访问它,如果未定义(前一点),则不会导致ReferenceError
。 / LI>
将window
显式分配给您定义的任何全局变量(例如,如果您打算将window.Module = (function () { …
全局化,请执行Module
)可能是一个好习惯,但这是有争议的讨论范围。