NodeJS 全局变量不可重新分配



我正在尝试单元测试使用 JavaScript 库的代码,如果它不存在,则设置一个全局变量。库使用的模式是:

var GLOBAL_VAR = GLOBAL_VAR || {}

这在浏览器世界中有效,但是当我在 NodeJS 中执行代码时,它不起作用。问题归结为:

var myGlobal = 'CORRECT';
console.log('Prints CORRECT', myGlobal || 'WRONG');
(function () {
// Why does this print WRONG?
var myGlobal = myGlobal || 'WRONG';
console.log('Prints WRONG', myGlobal);
}).call(this);
(function () {
console.log('Prints CORRECT', myGlobal || 'WRONG');
}).call(this);

为什么第一个函数打印错误,而第二个函数打印正确?

您正在声明一个局部变量myGlobal第一个匿名函数中。这会隐藏全局变量。

然后,在匿名函数中,声明:

var myGlobal = myGlobal || 'WRONG';
//             ^
//             |  this local variable is undefined here, as
//                the global is not accessible with this name

这就是为什么myGlobal(局部变量('WRONG'获取值的原因。

解决方案是将匿名函数中myGlobal命名混乱的局部变量重命名为不隐藏全局变量的名称。

请注意,如果您使用let,则不会遇到此问题let因为不允许您将变量用作其自己的声明中的值:

let x = x || 'WRONG'; // should produce an error and leave x undefined.

最新更新