es6模块如何导入自身?

香料先生

我有一个名为的模块fooModule在此模块内,我fooModule(本身)导入

import * as fooModule from './fooModule';

export function logFoo() {
  console.log(fooModule)
}

logFoo()被调用时,我可以看到fooModule的所有导出。这是如何运作的?

贝吉

对于声明性导入/导出,循环依赖关系没有问题。在您的情况下,圆是最小长度的:-)

解决方案是import不会将值导入变量,而是将变量作为导出变量引用看看这里的一个可变变量的一个例子,在这个问题的确切的术语。
模块名称空间对象也是如此-它们的属性只是解析为实际导出变量的getter。

因此,在加载和评估模块时,将发生以下步骤:

  1. 对源进行静态分析,exportimport声明以构建依赖关系图
  2. 模块作用域已创建
  3. 由于模块的唯一依赖关系是自身,并且已经被初始化,因此无需等待
  4. 使用fooModule模块的导出名称(已知为)创建变量并将其实例化为对象["logFoo"]fooModule.logFoo属性将成为一个获取器,它将对logFoo模块范围内变量求值(如果使用export {A as B}fooModule.B则将解析为A,但是在您的情况下,两个名称相同)。
  5. 在您的情况下logFoo模块作用域中的变量声明创建变量,并且函数声明被初始化(即,logFoo被分配了函数)
  6. 模块代码运行(在您的情况下,什么也没有发生)

现在,当您调用logFoo导入的模块时,fooModule将引用包含的名称空间logFoo没有魔法:-)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章