带有全局变量的Javascript中有趣的范围问题

时间:2016-04-20 13:29:51

标签: javascript node.js scope global-variables

我有一个包含许多模块的大型JS应用程序,最终将与browersify.捆绑在一起但是因为我不想让我的整个团队安装Node.js并在每次更改角色时重建它,希望模块在开发过程中全局注册。我一直在使用像这样的模块的标准注册:

// if browserify
if (typeof module === "object" && module.exports) {
    module.exports = myModule;
} else { window.myModule = myModule; }

这里变得很时髦:在app.js主文件中需要依赖项时,我这样做:

if (typeof module === "object" && module.exports) {
    var myModule = require("./js/myModule");
} // otherwise it's assumed to be globe, which console.log(window) confirms
console.log(myModule);

此控制台日志以未定义的形式返回,因此我需要一个else行:     } else {        myModule = window.myModule;     }

这是一个更简单的jsFiddle作为概念证明:

if (false) {
    var test = "Hello World";
} else {
  window.test = "Hello Globe";
}

document.getElementById("console").innerHTML = test;

test在此方案中未定义。

让我感到困惑的是,从未运行的if语句的内容似乎仍然将test注册为局部变量。那是怎么回事?或者我只是不明白全局变量是如何工作的?我认为注册到window的任何内容都可以通过它自己的名称来调用,就像我们不必每次都写window.jQuery一样。

1 个答案:

答案 0 :(得分:0)

Javascript提升var声明,因为你在if语句中声明不是新范围,基本上就是这样:

if (false) {
    var test = "Hello World";
} else {
  window.test = "Hello Globe";
}

与此相同:

var test;
if (false) {
  test = "Hello World";
} else {
  window.test = "Hello Globe";
}

这就是为什么在范围的开头声明变量是一个好习惯,请查看此示例:

var test = "Hello World From outside";
function(){
  console.log(test);
  if (false) {
    var test = "Hello World From inside"
  }
}

这个例子将输出:" undefined" var测试被提升到范围的顶部,在这种情况下,函数顶部覆盖外部变量声明尽管我们永远不会进入if