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
为什么会这样?
答案 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);