JavaScript中如何引用模块作用域?是否存在类似window的模块作用域对象?
ES 模块不存在类似
window 的全局作用域访问对象 ES 模块的作用域是完全封装的,规范没有对外暴露可直接访问的模块作用域对象,你之前尝试的两种方法不可行的原因如下:
- 模块顶层的
this被 ES 规范明确设定为undefined,不会指向作用域存储对象 - JS 所有词法作用域(包括函数作用域、模块作用域)的内部变量集合都不会被引擎暴露给开发者,这是为了保障作用域的封装性,避免内部变量被非预期的动态修改。
实现动态访问模块内变量的替代方案
如果你需要通过字符串动态获取模块内的导入对象或本地变量,可以用以下两种成熟方案:
方案1:手动维护索引对象
这是最通用、无副作用的方案,把你需要动态访问的内容显式挂载到一个普通对象上即可:
// 把需要动态访问的导入、本地变量统一放到索引对象中 const scopeMap = { // 示例:你导入的两个对象 importedA, importedB, // 也可以放模块内声明的本地变量 localUtil } // 之后直接通过字符串索引即可 const target = scopeMap[yourStringKey]
方案2:通过动态导入访问模块导出内容
如果你要访问的是模块对外导出的内容,可以直接用动态导入语法获取模块命名空间对象:
// 如果是访问当前模块的导出内容,可以直接导入当前模块路径 async function getExportByKey(key) { const moduleNamespace = await import(import.meta.url) return moduleNamespace[key] }
注意:该方案只能获取到模块通过
export对外暴露的内容,模块内部未导出的私有变量无法通过这种方式访问。
内容的提问来源于stack exchange,提问作者Md. Arefin Rabbi Emon
相关产品推荐
相关产品推荐

