javascript - 访问在动态导入的 JavaScript 中声明的变量?
问题描述
我正在开发单页架构 (SPA) Web 应用程序。我已经实现了动态加载应用程序不同页面的功能。
这就是我的spa.js 的样子
var spa = {
init: async () => {
await import('./page.js')
spa.data['page'].apply()
},
register: (page, data) => {
spa.data[page] = data
},
data: {},
}
window.onload = () => {
spa.init()
}
这就是我的page.js 的样子
const pageData = {
apply: () => {
document.body.innerHTML = getMSG()
}
}
function getMSG() {
return "hello message!"
}
spa.register('page', pageData)
工作流程说明:
- 最初spa.js加载。spa.data为空
- 它启动spa.init(),它加载page.js
- page.js将其数据注册到spa变量
- 现在控制跳转回spa.js和spa.data页面,它将执行apply()
这工作正常。但这里有一件奇怪的事情!
apply()方法可以访问裸getMSG(),但是当我尝试通过浏览器的开发人员控制台执行getMSG()时,我得到 ReferenceError 暗示根本没有定义getMSG() !我们的pageData 也是如此
这是托管的heroku应用程序,您可以尝试-dyn-import
虽然它非常好,因为我不必担心不同文件中的函数冲突,但我想知道这是怎么发生的。
有人可以解释我如何访问page.js中定义的方法和变量。我知道出口,但不知何故没有出口是可能的!
解决方案
如果未导出,则无法直接访问模块中定义的函数和变量。
spa
变量可以全局访问的原因是因为spa.js
是普通脚本,在 HTML 文档头中引用。
<head>
...
<script src="./spa.js"></script>
</head>
另一方面,如果您使用import
脚本,则变量位于不同的范围内,除非您将它们导出。所以page.js
被视为一个模块。
当然,您可以将函数附加getMSG()
到全局spa
变量或pageData
,但两者都是解决方法。
spa.getMSG = getMSG;
您可以在此处阅读有关模块和标准脚本之间差异的更多信息 - MDN JavaScript 模块。
推荐阅读
- sqlite - Sqlite通过Union by Groups加入2个表
- git - 防止 Git Interactive Rebase 打开 Atom
- ios - 有没有办法在 Swift 4 中使用 CGContext 创建没有指针的图像
- angular - 如何通过角度4中的函数在输入类型=“文件”处删除选定的文件名?
- c# - 在不使用 INotifyPropertyChanged 的情况下检测值更改
- react-native - 如何在本机反应中对齐多行文本
- java - Java 8 可选。为什么of和ofNullable?
- google-cloud-memorystore - 谷歌云内存存储和谷歌 AppEngine 标准与 python 3
- ios - 如何将发布请求发送到 Firebase 功能?
- javascript - Reactjs:如何更新 reactjs 中的投票计数