我正在使用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.
我删除了...
表示的额外代码。在本地运行以查看实际显示内容的完整范围。
是什么导致这种情况发生?
答案 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
。