javascript - 为什么我们可以在浏览器中使用全局变量?

标签 javascript ecmascript-6 babel-loader

众所周知,全局变量在浏览器中是window,在nodejs中是global

我阅读了一些 NPM 包的源代码,它们使用 globalglobal.Set 而不是 window.Set 。当我导入该包时,它在我基于浏览器的项目中运行良好。这让我很困惑。

我认为原因是babel。也许使用global可以通过babel编写跨平台包?但它是如何工作的。

package use global

最佳答案

我不是 babel 或 webpack 方面的专家,远非如此,但是查看 webpack 的输出代码,您可以看到 webpack 正在将 global 变体注入(inject)到您的代码中,如果您使用它,所以如果我们有一个简单的代码,例如:

console.log("just a test");

这就是我们源代码中的最终内容:

eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] =

但是,如果我们使用下一个代码:

console.log("just a test", global);

这是我们的输出:

eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] =

您可以清楚地看到变化。

找到这个issue您可能会发现这对解决这个问题很有帮助。

据我了解,babel正在使用this在内部,因此如果您在代码中使用它,它会导出它。

请注意,您无法在控制台中访问global变体。

注意 globalwindow 是同一个对象,它不是副本,因此对 global 所做的所有更改都将在 window 上完成

关于javascript - 为什么我们可以在浏览器中使用全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58006810/

相关文章:

javascript - 查找距离另一个坐标一定距离的坐标

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

npm - 不兼容的 babel-loader 和 babel-core 版本

javascript - 在 Promise-mysql 的 createConnection 中使用异步函数会改变加载速度吗?

javascript - js reduce 中的默认参数被忽略

javascript - Webpack 4 + Babel 7 转换运行时 - 无效的配置对象

reactjs - create-react-app 与 storybook 6.1.6 集成并且构建有错误

javascript - 如果它是动态生成的,如何替换所有捕获组?

JavaScript:window.spam 是一个好习惯吗?

javascript - 如何更改 Bootstrap 多选下拉菜单的高度和字体大小?