nodejs中模块中的全局对象是什么?

时间:2012-06-30 17:52:29

标签: javascript node.js scope

我知道在节点中,每个模块都获得一个局部范围,并且在一个模块中定义的变量不会转义到全局,除非显式导出。

我想知道的是当我在一个模块文件中声明一个变量时,这个变量定义的全局对象是什么?

var obj = {};
// In browser, this is defined on window.obj
// How about in the node?

one statement global是用作本地全局范围的对象,但是以下测试代码失败:

a = 1
console.log global.a
// undefined

那么模块的全局变量是什么?

2 个答案:

答案 0 :(得分:1)

实际上节点中有一个全局对象;它简称为global。您可以为其分配属性并像访问任何其他对象一样访问这些属性,您可以跨模块执行此操作。但是,直接访问它(一个模块中的global.foo=bar,另一个模块中的baz=global.foo)是唯一方式来访问它。非限定变量名称​​从不自动解析为其属性,例如,浏览器环境中的非限定变量名称将解析为window.somethingOrOther。在节点中,每个模块在概念上都包含在一个立即函数调用中,因此非限定名称代表局部变量并具有模块级范围。

答案 1 :(得分:0)

再次编辑我只是准备得出结论,在Node模块中,无法获取对全局对象的引用。你真的不应该这样;我认为这就是模块机制的重点。您可以导入所需内容并导出所选内容。

在Node中是否有 一个全局对象是一个有趣的问题,我想。我知道在Rhino中肯定存在;从Java容器中提供给Rhino的代码没有隐式包装函数。通过Java ScriptEngine机制(可能来自“裸”Rhino中的Mozilla API),有一些方法可以将符号推送到全局上下文中,以使它们作为全局对象属性对JavaScript可见。

哇这很复杂在Node.js世界中,似乎有些事情正在发生变化。我上面写的内容对于Node 0.6.2来说是正确的,但是在0.9.0-pre版本中,我刚刚做了一个名为“global”的对象,其行为或多或少与浏览器中的全局对象相似。


以下内容适用于浏览器和Rhino以及其他类似

的上下文

您可以在全局范围内使用this。如果你需要一个名字,你可以给它一个。

var global = this;

var obj = "Hi!";

global.obj = "Bye"; // sets "obj"

(某种程度上)常见的习惯用法是将代码包装在函数中,以保护全局命名空间。

(function( global ) {
  // everything
})( this );

警告:我不是Node人,所以在这种文化中可能会出现一些新兴的习语。

编辑 - 我发现如果Node确实从函数中评估的文件中包装代码,并且 没有将this传递给它来自全球背景,然后没有办法“找到”它,我不认为。如果你使用“use strict”(并且你应该),那没关系,因为无论如何你都不能真正搞乱全局背景。