我想知道的是,当我在一个模块文件中声明以下变量时,这个变量定义在哪个全局对象上?
var obj = {};
// In browser, this is defined on window.obj
// How about in the node?
有一条语句说global
是用作本地全局范围的对象,但以下测试代码失败:
a = 1
console.log global.a
// undefined
那么模块的全局变量是什么呢?
var obj = {};
// In browser, this is defined on window.obj
// How about in the node?
有一条语句说global
是用作本地全局范围的对象,但以下测试代码失败:
a = 1
console.log global.a
// undefined
那么模块的全局变量是什么呢?
事实上,Node 中有一个全局对象,它被简单地称为 global
。您可以向其分配属性并像任何其他对象一样访问这些属性,您可以跨模块执行此操作。但是,直接访问它(在一个模块中使用global.foo=bar
,在另一个模块中使用baz=global.foo
)是访问它的 唯一 方式。未经限定的变量名称从不会自动解析为其属性,就像浏览器环境中未经限定的变量名称将解析为window.somethingOrOther
。
在 Node 中,每个模块在一个立即函数调用内概念化包装起来,因此未经限定的名称表示本地变量并具有模块级作用域。
再编辑 我快要得出结论了,在一个 Node 模块中,你 不能 获得对全局对象的引用。你真的不应该需要这样做;我认为这就是模块机制的全部意义。你导入你所需的,导出你选择的。
在 Node 中是否有全局对象是一个有趣的问题,我想。我知道在 Rhino 中肯定有;在从 Java 容器中提供给 Rhino 的代码周围没有隐式包装函数。通过 Java ScriptEngine 机制(以及可能是来自“裸”Rhino中的 Mozilla API),有办法将符号推入全局上下文中,以使它们作为全局对象属性对 JavaScript 可见。
哇,这变得复杂了 好像 Node.js 的世界正在发生变化。我上面写的对于 Node 0.6.2 是正确的,但是在我刚刚做的 0.9.0-pre 版本中确实有一个名为 "global" 的对象,它的行为几乎类似于浏览器中的全局对象。
var global = this;
var obj = "Hi!";
global.obj = "Bye"; // sets "obj"
(function( global ) {
// everything
})( this );
注意:我不是Node的专家,所以可能存在一些在该文化中新兴的习语。
编辑——我想到了一个问题,如果Node确实将代码从文件中评估为函数,并且它没有从全局上下文中传递this
,那么我认为就没有办法“找到”它。如果你使用"use strict"(你应该这样做),那么这并不重要,因为你无法真正干扰全局上下文。
(function () {})()
中,以保护代码不会污染全局作用域。 - steveyang
var glob = (function(){return this;})();
- 在基于浏览器的JS世界中,对于大多数环境,这将返回Window对象。 - Pebbl0.8.1
和0.6.19
,但两者都无法通过上述代码。 - steveyang