我有一个包含许多模块的大型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
一样。
答案 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