往期回顾:
前端开发必备 - ES6 新特性之 let 和 const 命令
前端开发必备 - ES6 新特性之 变量的解构赋值
前端开发必备 - ES6 新特性之 字符串的拓展
前端开发必备 - ES6 新特性之 正则的拓展
前端开发必备 - ES6 新特性之 数值的拓展
前端开发必备 - ES6 新特性之 对象的拓展
前端开发必备 - ES6 新特性之 Symbol
前端开发必备 - ES6 新特性之 Set和Map数据结构
前端开发必备 - ES6 新特性之 Proxy
前端开发必备 - ES6 新特性之 Promise对象
前端开发必备 - ES6 新特性之 Iterator和 for...of循环
前端开发必备 - ES6 新特性之 Generator函数和应用
前端开发必备 - ES6 新特性之 Class语法和继承
16.1 介绍
ES6之前用于JavaScript的模块加载方案,是一些社区提供的,主要有CommonJS和AMD两种,前者用于服务器,后者用于浏览器。
ES6提供了模块的实现,使用export命令对外暴露接口,使用import命令输入其他模块暴露的接口。
![60e9ca813dc1d406e5a2085eab8bd36b.png](https://img-blog.csdnimg.cn/img_convert/60e9ca813dc1d406e5a2085eab8bd36b.png)
16.2 严格模式
ES6模块自动采用严格模式,无论模块头部是否有"use strict"。
严格模式有以下限制:
- 变量必须声明后再使用
- 函数的参数不能有同名属性,否则报错
- 不能使用with语句
- 不能对只读属性赋值,否则报错
- 不能使用前缀 0 表示八进制数,否则报错
- 不能删除不可删除的属性,否则报错
- 不能删除变量delete prop,会报错,只能删除属性delete * global[prop]
- eval不会在它的外层作用域引入变量
- eval和arguments不能被重新赋值
- arguments不会自动反映函数参数的变化
- 不能使用arguments.callee
- 不能使用arguments.caller
- 禁止this指向全局对象
- 不能使用fn.caller和fn.arguments获取函数调用的堆栈
- 增加了保留字(比如protected、static和interface)
特别是,ES6中顶层this指向undefined,即不应该在顶层代码使用this。
16.3 export命令
使用export向模块外暴露接口,可以是方法,也可以是变量。
![68508fbce2bdb84139cf7657fd206fdb.png](https://img-blog.csdnimg.cn/img_convert/68508fbce2bdb84139cf7657fd206fdb.png)
可以使用as重命名函数的对外接口。
特别注意:
export暴露的必须是接口,不能是值。
![8a77eb293b5b350a17bdc57f644d4697.png](https://img-blog.csdnimg.cn/img_convert/8a77eb293b5b350a17bdc57f644d4697.png)
暴露方法也是一样:
![716a426afc0eff1efa9d0f68a4985ab9.png](https://img-blog.csdnimg.cn/img_convert/716a426afc0eff1efa9d0f68a4985ab9.png)
16.4 import命令
加载export暴露的接口,输出为变量
![78e62a3060c40e5bbad1cfed778ab104.png](https://img-blog.csdnimg.cn/img_convert/78e62a3060c40e5bbad1cfed778ab104.png)
import后大括号指定变量名,需要与export的模块暴露的名称一致。
也可以使用as为输入的变量重命名。
import { a as leo } from './a.js';
import不能直接修改输入变量的值,因为输入变量只读只是个接口,但是如果是个对象,可以修改它的属性。
![a42fba18b26e8a27b057dab2e995667c.png](https://img-blog.csdnimg.cn/img_convert/a42fba18b26e8a27b057dab2e995667c.png)
import命令具有提升效果,会提升到整个模块头部最先执行,且多次执行相同import只会执行一次。
16.5 模块的整体加载
当一个模块暴露多个方法和变量,引用时可以用*整体加载。
![49375d77ec2593c41b382d6fbdc6b8db.png](https://img-blog.csdnimg.cn/img_convert/49375d77ec2593c41b382d6fbdc6b8db.png)
但是,不允许运行时改变:
![412cfa89693c33dc3d4809b690271798.png](https://img-blog.csdnimg.cn/img_convert/412cfa89693c33dc3d4809b690271798.png)
16.6 export default 命令
使用export default命令,为模块指定默认输出,引用的时候直接指定任意名称即可。
![f825be9a50e62e85b502476ef9af36ba.png](https://img-blog.csdnimg.cn/img_convert/f825be9a50e62e85b502476ef9af36ba.png)
export default暴露有函数名的函数时,在调用时相当于匿名函数。
![83092b40bc19ab0de65d569be013a366.png](https://img-blog.csdnimg.cn/img_convert/83092b40bc19ab0de65d569be013a366.png)
export default其实是输出一个名字叫default的变量,所以后面不能跟变量赋值语句。
![0e777312f19d931e2369b9e203c6bc92.png](https://img-blog.csdnimg.cn/img_convert/0e777312f19d931e2369b9e203c6bc92.png)
export default命令的本质是将后面的值,赋给default变量,所以可以直接将一个值写在export default之后。
![250ac7e09cec1b626ad9a3ff70f0abc4.png](https://img-blog.csdnimg.cn/img_convert/250ac7e09cec1b626ad9a3ff70f0abc4.png)
16.7 export 和 import 复合写法
常常在先输入后输出同一个模块使用,即转发接口,将两者写在一起。
![882dc88ed0a3f2133be8936e14c7ae3a.png](https://img-blog.csdnimg.cn/img_convert/882dc88ed0a3f2133be8936e14c7ae3a.png)
常见的写法还有:
![fb19901bd781b825f225dd26b83f9465.png](https://img-blog.csdnimg.cn/img_convert/fb19901bd781b825f225dd26b83f9465.png)
常常用在模块继承。
16.8 浏览器中的加载规则
ES6中,可以在浏览器使用