gpt4 book ai didi

javascript - 关于 Node.js 中的全局变量

转载 作者:行者123 更新时间:2023-12-01 15:19:34 33 4
gpt4 key购买 nike

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

为什么会这样?

最佳答案

当一个脚本运行时,它被包装在一个模块中。脚本中的顶级变量位于模块函数内部,不是全局变量。这就是 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变量实际上是模块函数包装器中的局部变量,而不是全局范围内的变量,因此如果您希望它在全局范围内,则必须将其分配给全局对象。

关于javascript - 关于 Node.js 中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34967530/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com