图片授权基于 www.pixabay.com 相关协议
在创建JavaScript模块时,export 语句用于从模块中导出函数、对象或原始值,以便其他程序可以通过 import 语句使用它们。
ES6 模块是「静态装配」的,所有动态逻辑执行完后,ES6 模块就可以用来理解程序中静态代码。我理解的动态逻辑执行就是表达式执行,当所有的表达式都执行完后,只会剩下引用的名字和值,所以 ES6 导出只有「名字」和「值」,因为其他的所有东西都被执行过了嘛。
export var js = \\\'JavaScript\\\';
export function jsFn(){}
export class jsClass{}
上面的 export 导出会形成一个「名字表」,来让允许外部查看。
export var js = \\\'JavaScript\\\';
导出名字是可以理解的,因为「变量」名字被赋值过了。现在我导出了字符串\\”JavaScript\\”,它的导出名字是「js」。在外部是可以访问到的。但如果说我只想导出一个数字「1」,也就是说,我只导出一个「值」,它没有名字,那如何操作?
其实,ES6 模块约定了一个名为「default」的名字,用来导出当前表达式的值(result)。有了「default」这个名字,我们就可以导出没有名字的值。因为你的值,会直接绑定「default」这个名字。
先在名字表添加名字 x,再把值赋值给 x 。其实和变量赋值的逻辑是一样的。
先按语法在当前模块声明名字,再添加当前模块对目标模块的依赖项,根据依赖项来形成模块「依赖树」。
依赖树,因为你的模块导入可能是多个模块相互依赖,JavaScript 要找到最顶端的「根模块」。
export 是导出一个「名字列表」,在执行顶层代码的时候,会把表达式的值赋值给变量。
import 是引入一个「对应表」,只在词法分析中存在,import 的名字和 export 的名字是一个映射关系,加载的时候也就初始化完成了。
被 import 导入后,名字是按常量处理,不可写的。而「default」名字虽然没有声明过,但它是以 var 的形式进行创建的。
在 import 的时候,代码会「变量提升」到最顶部。
推荐阅读
JavaScript 的装箱和拆箱
[1]https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/export
原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34476.html