问题描述
我一直在关注教程,当在ModuleTwo中将Module用作参数引用时,一切正常, 直到我注释掉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 || {});
1楼
当您应用定义你的第二模块的功能(Module || {})
符号Module
不能,如果解决Module
尚未早些时候宣布,它总是给人一种JavaScript错误。
如果即使在没有第一个模块的情况下也要定义第二个模块,请尝试以下操作:
var ModuleTwo = (function(Module) {
...
})(typeof Module == 'object' ? Module : {} );
2楼
基本上,本教程中有一个错误。
rplantiko提出了一种使事情正常运行的方法,但仅编写window可能会更容易window.Module || {}
window.Module || {}
代替Module || {}
Module || {}
。
这里的运作方式:
-
访问任何对象的不存在的属性将产生
undefined
。 但是,引用未声明的变量会产生ReferenceError
(因此,您的理解还差一点)。 -
浏览器将所有全局变量作为属性放到全局
window
对象上。 本教程中的Module
是全局变量,因为它是在所有函数外部声明的,因此您可以通过window.Module
对其进行访问,如果未定义(按上一点),则不会导致ReferenceError
。
最好将您定义的任何全局变量显式分配给window
(例如,执行window.Module = (function () { …
如果您打算使Module
成为全局变量),这是一个好习惯,但这是有争议的,不在本讨论范围之内。