为什么global.module在一个文件中是未定义的,但在Node REPL中它是全局对象?

如果我:

console.log(global.module); 

在一个文件foo.js中执行它:

 node foo.js 

它输出未定义。 但是,如果我在启动节点REPL时访问全局对象上的相同属性,则它是一个对象。 作为parameter passing给模块包装函数module的相同实际对象。

为什么它不在全局对象的文件中,而是在REPL中?

在模块文件的上下文中, module不是全局variables,它实际上是一个局部variables。 在执行之前,节点模块代码实际上是用这样的代码包装的:

 (function (exports, require, module, __filename, __dirname) { 

所有这些variables对于每个模块都必须是唯一的,所以它们不能是全局variables。

在REPL和其他代码中,在全局范围内被评估,这些variables被添加为全局对象的属性,所以你仍然可以使用像require这样的东西。