我正在尝试对使用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);
为什么第一个功能打印错误,而第二个功能打印正确?
答案 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.