3

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

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

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

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

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

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

4

2 回答 2

1

There is in fact a global object in node; it's simply called global. You can assign properties to it and access those properties just like any other object, and you can do it across modules. However, directly accessing it (global.foo=bar in one module, baz=global.foo in another) is the only way to access it. Unqualified variable names never automatically resolve to its properties the way that, say, an unqualified variable name in a browser environment would resolve to window.somethingOrOther. In node, every module is conceptually wrapped inside an immediate function call, so unqualified names represent local variables and have module-level scope.

于 2012-07-01T00:57:32.553 回答
0

再次编辑我正准备得出结论,在 Node 模块中,您无法获得对全局对象的引用。你真的不需要;这就是模块机制的重点,我想。您导入所需的内容并导出您选择的内容。

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

哇,这变得复杂了,Node.js 世界中的事情似乎正在发生变化。我上面写的对于 Node 0.6.2 来说是正确的,但在 0.9.0-pre 构建中,我确实有一个名为“全局”的对象,它的行为或多或少类似于浏览器中的全局对象。


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

您可以this在全局上下文中使用。如果你需要一个名字,你可以给它一个。

var global = this;

var obj = "Hi!";

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

一个(有点)常见的习惯用法是将代码包装在一个函数中,以保护全局命名空间。

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

警告:我不是 Node 人,所以在那种文化中可能会有一些新兴的成语。

编辑——我突然想到,如果 Node 确实将代码从它在一个函数中评估的文件中包装起来,并且它没有从全局上下文中传递this给它,那么就没有办法“找到”它,我不认为。如果你使用“use strict”(你应该),那没关系,因为无论如何你都不能真正搞乱全局上下文。

于 2012-06-30T17:53:48.703 回答