Module
ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。 ES6 模块不是对象,而是通过export
命令显式指定输出的代码,再通过import
命令输入。
严格模式
ES6模块默认使用严格模式,不管是否有use strict
。
严格模式特点:
变量必须声明后再使用
函数的参数不能有同名属性,否则报错
不能使用
with
语句不能对只读属性赋值,否则报错
不能使用前缀0表示八进制数,否则报错
不能删除不可删除的属性,否则报错
不能删除变量
delete prop
,会报错,只能删除属性delete global[prop]
eval
不会在它的外层作用域引入变量eval
和arguments
不能被重新赋值arguments不会自动反映函数参数的变化
不能使用
arguments.callee
不能使用
arguments.caller
禁止this指向全局对象,实际会指向
undefined
不能使用
fn.caller
和fn.arguments
获取函数调用的堆栈增加了保留字(比如
protected
、static
和interface
)
export 命令
export
命令不可以在块级作用域内使用。
export
命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。 不可以直接输出值。
export
的接口与对应的值是动态绑定的,取到的是模块内部实时的值。
import 命令
使用import
模块加载export
定义的对外接口。
import
导入模块与export
对外接口的名称必须相同。
import
的特点:
import
命令有提升效果,提升到头部首先执行。import
是静态执行,不能使用表达式或者变量。import
同一个模块加载多次,也只会执行一次。
整体加载:
会一起加载模块当中的两个方法。
默认模块加载
一个模块只能有一个默认输出,export default
命令只能使用一次。 export default
本质是将该命令后面的值,赋给default
变量。
使用备注
import
与export
命令在Nodejs环境中不支持,建议使用traceur
运行ES6代码文件。
安装:
脚本异步加载
script
标签如果有defer
或async
属性,脚本就会异步加载。
区别:
defer:整个页面正常渲染结束,才会执行
async:一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再继续渲染。
多个defer
脚本会按顺序加载,async
不能包证按顺序加载。
ES6 模块与 CommonJS 模块的差异
区别:
CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
ES6import
的模块原始值变了,import加载的值也会跟着变。
模块变量是一个“符号链接”,只读,赋值会报错。
CommonJS模块如果是原始类型的值,不会影响输出值,但可以写成函数,会等到变动后的结果。
Last updated