我有一个名为fooModule
的模块。在这个模块中,我导入fooModule
(本身):
import * as fooModule from './fooModule';
export function logFoo() {
console.log(fooModule)
}
调用logFoo()
时,我可以看到fooModule的所有导出。
这是如何运作的?
答案 0 :(得分:10)
循环依赖对于声明性导入/导出没有问题。在你的情况下,圆圈的长度最小: - )
解决方案是import
不会将值导入变量,而是将变量作为引用变量导出变量。请查看here以获取可变变量的示例,并在this question查看完整的术语。
模块命名空间对象也是如此 - 它们的属性只是解析为实际导出变量的getter。
因此,在加载和评估模块时,会发生以下步骤:
export
和import
声明进行静态分析,以构建依赖关系图fooModule
变量并将其实例化为具有模块导出名称的对象,已知为["logFoo"]
。 fooModule.logFoo
属性将成为评估模块范围中logFoo
变量的getter(如果您使用了export {A as B}
,那么fooModule.B
将解析为A
,但在你的情况下,两个名字是相同的。)logFoo
,并初始化函数声明(即为logFoo
分配函数)现在,当您在导入它的模块中调用logFoo
时,fooModule
将引用包含logFoo
的命名空间。没有魔法: - )