无法重新分配NodeJS全局变量

时间:2019-09-18 21:24:36

标签: javascript node.js global-variables

我正在尝试对使用JavaScript库的代码进行单元测试,该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);

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

1 个答案:

答案 0 :(得分:2)

您正在第一个匿名函数内声明局部变量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.