3

我遇到了 Node.js 的以下问题v0.10.1(通过一个快速示例进行演示):

在交互式命令行中运行节点时:

> global.require
{ [Function: require] . . . }
> require
{ [Function: require] . . . }

运行以下命令时,script.js我得到了意想不到的结果:

console.log(global.require);     // 1.
console.log(require);            // 2.
undefined                        // 1. `global.require` is undefined!
{ [Function: require] . . .}     // 2. `require` by itself works however.

我删除了由.... 在本地运行它以查看实际显示的全部内容。

是什么导致这种情况发生?

4

2 回答 2

2

Node.js 包含一个repl模块,它允许您创建自己的 Read-Evaluate-Print-Loops(这就是它的意思repl)。使用这个模块有一个函数start可以用来创建一个新的 repl。

此函数采用一个options 对象,您可以在其中配置您的 repl。这些选项之一称为useGlobal. 根据此选项的文档,以下句子是有效的:

如果设置为true,则 repl 将使用该global对象,而不是在单独的上下文中运行脚本。默认为false.

现在,当您以交互模式启动 Node.js 时,这基本上只是一个 repl,就像您可以使用该repl模块为自己创建的那样。我猜(请注意,这只是一个猜测!)Node.js 的默认 repl 已useGlobal设置为true.

因此,您有一个global对象,它又与全局命名空间完全相同。因此require,您可以在全局命名空间中找到的所有功能,您将再次在global对象上找到。

一旦以非交互模式启动 Node.js 应用程序,就没有 repl,因此也就没有global对象。

这对你有意义吗?

于 2013-03-26T19:11:03.460 回答
2

许多全局变量通常不在全局范围内或global对象的成员中:

这些对象在所有模块中都可用。其中一些对象实际上不在全局范围内,而是在模块范围内——这将被记录下来。

这些是第二种解释更多的“全局变量”:

  • 最顶级的范围。
  • 属于当前本地范围以外的可访问范围。

此外,如前所述require()

需要模块。请参阅模块部分。require实际上不是全局的,而是每个模块的本地。

管理交互模式的REPL 模块可以选择将它们提升到全局范围:

useGlobal- 如果设置为true,则 repl 将使用该global对象,而不是在单独的上下文中运行脚本。默认为false.

于 2013-03-26T19:11:36.127 回答