为什么默认导出不像命名导出那样实时?
//------ lib.js ------
export let counter = 0;
export function incCounter() {
counter++;
}
export default counter;
//------ main1.js ------
import { counter, incCounter } from "./lib";
import $counter from "./lib";
console.log({ $counter, counter }); // {$counter: 0, counter: 0}
incCounter();
console.log({ $counter, counter }); // {$counter: 0, counter: 1}
这表明,命名为counter
导出是实时的,但默认导出不是实时的。为什么?
据我所知,这纯粹是因为这是定义模块的人做出的决定,因为他们希望允许导出任意表达式的结果。接下来是什么export default
is an 表达,不是绑定(除非它是函数声明或class
宣言)。例如,这是一个有效的默认导出:
export default 6 * 7;
So your export default counter;
is 评估的价值counter
然后导出它,而不是实时绑定。
你可以在语法中看到这一点模块部分的顶部 https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#sec-exports规格:
export default
HoistableDeclaration[~Yield, +Await, +Default]
export default
类声明[~Yield、+Await、+Default]
export default
[lookahead ∉ { function, async [这里没有 LineTerminator] function, class }] 赋值表达式[+In, ~Yield, +Await] ;
前两个覆盖函数声明和class
声明;第三个,导出结果赋值表达式,是您的代码正在使用的。
It could定义不同,但事实并非如此。(主观上:可能有充分的理由,lot思想融入了模块的设计。)
我怀疑希望能够导出任意表达式的结果的原因主要是使用默认导出来导出对象文字的结果:
export default {
something: "some value",
// ...
};
例如,当使用模块作为配置文件时,这很有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)