导致全局变量差异的原因(交互式与脚本)

时间:2013-03-26 18:59:30

标签: node.js

我正在使用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.

我删除了...表示的额外代码。在本地运行以查看实际显示内容的完整范围。

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

2 个答案:

答案 0 :(得分: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个对象。

这对你有意义吗?

答案 1 :(得分:2)

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

  

所有模块都提供这些对象。 其中一些对象实际上并不在全局范围内,而是在模块范围内 - 这将被注意到。

第二种解释更多是“全局”:

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

另外,正如require()所述:

  

要求模块。请参阅Modules部分。 require实际上并非全局,而是每个模块的本地。

管理交互模式的REPL module可以选择推广到全局范围:

  

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