关于Node.js中的全局变量

时间:2016-01-23 19:03:05

标签: javascript node.js

Node.js似乎使用不同的规则将变量附加到global对象,无论是在REPL中还是在脚本中完成。

$ node
> var a = 1;
undefined
> a
1
> global.a
1
> a === global.a
true

如上所示,在REPL中工作时,使用var声明变量会在global对象上创建一个具有该变量名称的新属性。

然而,在剧本中似乎并非如此:

// test.js

var a = 1;
console.log(a);
console.log(global.a);
console.log(a === global.a);

让我们运行脚本:

$ node test.js
1
undefined
false

为什么会这样?

2 个答案:

答案 0 :(得分:8)

运行脚本时,它将包装在模块中。脚本中的顶级变量位于模块函数内部,不是全局变量。这是node.js加载和运行脚本的方式,无论是在初始命令行中指定还是加载require()

REPL中运行的代码未包含在模块函数中。

如果您希望变量是全局变量,则可以将它们专门分配给global对象,这可以在脚本或REPL中使用。

 global.a = 1;

全局变量通常在node.js中不受欢迎。相反,通过模块构造函数或其他模块方法传递对它们的引用,根据需要在特定模块之间共享变量。

在node.js中加载模块时,模块的代码将插入到函数包装器中,如下所示:

(function (exports, require, module, __filename, __dirname) {
     // Your module code injected here
});

因此,如果在模块文件的顶层声明变量a,则代码将最终由node.js执行,如下所示:

(function (exports, require, module, __filename, __dirname) {
      var a = 1;
});

从那里,您可以看到a变量实际上是模块函数包装器中的局部变量,而不是全局范围,因此如果您希望它在全局范围内,则必须将其分配给全球对象。

答案 1 :(得分:0)

Node.js中没有window,但还有另一个名为global的最高对象。

您可以从另一个模块访问您在一个模块中分配给global.something的任何内容。

示例:

<强> app.js

global.name = "myName"

现在您可以从任何模块中获取global.name

<强> myController.js

console.log(global.name);  // output: myName

<强> anotherModule.js

console.log(global.name);  // output: myName

现在当你在一个模块var i=0;声明一个变量时,它是否可以从所有模块中获得?不!

因为所有项目代码都包含在模块下,所以在REPL上它没有。它是最高级别的。这就是REPL变量变为全局的原因。

因此,如果您想使用全局,则必须使用global前缀

global.a = 1;
console.log(global.a);