Eloquent JavaScript 中的 "exports" 如何工作?

How does "exports" from Eloquent JavaScript work?

我从 this passage of Eloquent JavaScript 中发现这段代码我无法理解:

(function(exports) {
    var names = [" Sunday ", " Monday ", " Tuesday ", " Wednesday ",
                " Thursday ", " Friday ", " Saturday "];
    exports.name = function(number) {
        return names[number];
    };
    exports.number = function ( name ) {
        return names.indexOf ( name );
    };
})(this.weekDay = {});

console.log(weekDay.name(weekDay.number("Saturday")));

特别是看不懂this.weekDay:这里的this是什么? 以及我们如何访问 weekDay.name——它在函数的范围内,那么我们如何在函数外访问它?

weekDaynot 在显示的函数范围内访问; exports 是。

分配给weekDay(即this.weekDay = {})的新对象作为参数提供给IIFE(立即调用的函数表达式);因此在函数内部修改对象(通过exports)会影响其他地方的同一个对象..

.. 由于原始赋值,此对象在调用范围内称为 weekDay(全局变量)。

(function ( exports ) {
  // in function
})( this.weekDay = {} );  // <-- not in function, 'this.' is superfluous

在全局范围内,this 指的是全局对象(在网络浏览器中是 window,在 Node.js 中是 global)。所以在这种情况下,赋值 this.weekDay = {} 等同于 window.weekDay = {} 或者只是 weekDay = {},所有这些都创建了一个名为 weekDay 的全局变量。使用 this 而不是 window 的好处是您可以对浏览器和 Node 使用相同的表示法。模块定义下方对 weekDay 的引用仅指全局 weekDay 变量;它们也可以写成 this.weekDaywindow.weekDay

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this