关于 ES6 Module
的循环依赖机制有个小问题,关于 export default
的。
//a.mjs
import bar from './b.mjs';
function foo(invoker) {
console.log(invoker + ' invokes foo.js');
bar('foo.js');
}
foo('index.js');
export default foo;
//b.mjs
import foo from './a.mjs';
let invoked = false;
function bar(invoker) {
if (!invoked) {
invoked = true;
console.log(invoker + ' invokes bar.js');
foo('bar.js');
}
}
export default bar;
执行 a.mjs
,在执行到 bar
函数中调用 foo
的地方报错:ReferenceError: Cannot access 'foo' before initialization
。
把 a.mjs
中的 foo()
调用移动到 export default
之后能正常运行,或者把 export default
改成普通的 export {}
形式也可以。
我猜想是不是 export default
也只是把后面的值传给 default
(假想成一个变量之类的),然后这个 default
类似于 let
有暂时性死区,只有执行到 export default
这一句时才给 default
赋值,所以会造成上面的现象。
希望有大佬给一个解答,感谢。
我其他的关于循环依赖的一些问题都写在了 循环加载 一文中,有兴趣的朋友欢迎交流一下。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…