赋值给exports和module之间的区别是什么?

What is the difference between assigning to exports vs. module?

本文关键字:区别 是什么 之间 module exports 赋值      更新时间:2023-09-26

考虑以下基于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);

在这个例子中,当exportsFOO的工作方式相同时,为什么要分配给它们呢?有什么区别呢?

两个版本不相等。第二个给出了一个错误,当你试图分配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;
}());