考虑以下代码,基于"松散增强" http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html
中描述的模块模式var FOO = (function(exports) {
//What is the difference between this:
exports.hello = "hello";
return exports;
}(FOO || {}));
var FOO = (function(exports) {
//And this:
FOO.world = "world";
return exports;
}(FOO || {}));
//When the result works either way:
alert(FOO.hello + " " + FOO.world);
在这个示例中,为什么当它以相同的方式工作时,会分配给exports
与FOO
?有什么区别?
答案 0 :(得分:2)
这两个版本不相同。当您尝试分配FOO.world
时,第二个会出错,因为此时FOO仍未定义。现在你的代码只能工作,因为第一个模块定义是创建FOO对象。
至于为什么exports
变量的主要原因是它将模块定义与模块名称分离。您只需要编写一次模块名称(FOO),如果您在服务器端环境中,甚至可能不需要使用模块名称(它隐含在文件名中)。
注意你在游戏中的链接,甚至简单的"模块导出"版本已使用" my"模块的变量,而不是直接分配给MODULE:
var MODULE = (function () {
var my = {},
privateVariable = 1;
function privateMethod() {
// ...
}
my.moduleProperty = 1;
my.moduleMethod = function () {
// ...
};
return my;
}());