javascript - Javascript 中带有全局变量的有趣作用域问题

标签 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 行,其中显示: } 别的 { 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 一样。

最佳答案

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

关于javascript - Javascript 中带有全局变量的有趣作用域问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36745421/

相关文章:

javascript - `function` 声明是函数范围的,但 `async function` 声明是 block 范围的?

javascript - 通过 AJAX 将 JSON 数组发布到 php 失败

javascript - JS 按特定排序顺序排序

c# - 使用 VS 的 Unity 工具在 VS 中调试 C# 时,所有变量都超出范围

javascript - 获得两者 - 下载链接和链接以使用 aws sdk 从 s3 存储桶在浏览器中查看

node.js - 如何使用 exceljs 从 Promise 中返回文档

javascript - 存储稍后将使用的数据的最佳方式(Vanilla-JavaScript)

javascript - jQuery 360 倒计时 - 计时器运行时添加秒数的按钮

javascript - 如何在 Angular 6 CLI 应用程序中包含 Leaflet.TextPath 或 Leaflet.PolylineDecorator?

javascript - Node-webkit 只运行 .js 文件?