Javascript ES6模块:在完成定义之前导出?

Javascript ES6模块:在完成定义之前导出?,javascript,ecmascript-6,es6-modules,Javascript,Ecmascript 6,Es6 Modules,我想知道从另一个文件访问Foo.bar是否保证有效,因为我正在“导出Foo之后”向类Foo添加一个新属性bar(例如,充当静态成员) //foo.js //我们在这里出口食品 出口类食品{ // ... } //注意,这是在Foo的定义块之后“添加”的 Foo.bar='a'; //index.js 从'/Foo.js'导入{Foo}; console.log(Foo.bar)/“a”还是“未定义”? 我在Chrome和Firefox中试用过,效果很好(打印a而不是undefined),但我

我想知道从另一个文件访问
Foo.bar
是否保证有效,因为我正在“导出
Foo
之后”向类
Foo
添加一个新属性
bar
(例如,充当静态成员)

//foo.js
//我们在这里出口食品
出口类食品{
// ...
}
//注意,这是在Foo的定义块之后“添加”的
Foo.bar='a';
//index.js
从'/Foo.js'导入{Foo};
console.log(Foo.bar)/“a”还是“未定义”?
我在Chrome和Firefox中试用过,效果很好(打印
a
而不是
undefined
),但我不确定这是否是任何独立于实现的ECMAScript所允许的有效语法


我认为这与标准Ask JS解释器如何解释模块文件
foo.JS
有关:它是否在看到类
foo
实现的结束括号时立即向导入程序公开
foo
,或者它在公开
foo
之前完成了对整个
foo.js
的解析吗?

它在返回模块之前完成了解析。必须这样做,因为在同一个文件中,您可以一个接一个地导出更多的
s。因此,它是有效的语法,应该在支持ESModules的浏览器中工作

正如我在示例中所示,首先解析
foo.js
文件,然后在
index.js
中返回模块。您可以在控制台中进行检查。首先

parsed whole foo.js file 
出现日志,然后

now printing Foo.bar a 

出现了。如您所见,在
exports
关键字之后引用导出的对象是有效的。

它是有效的。它解析文件,然后返回moduleIt,就您的示例而言,它是有效的。但是要注意循环依赖关系:在这种情况下,您可以在使用导入/导出定义之前引用某些内容,循环性并不总是明显的(A导入B导入C导入D导入A)。