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
Was this helpful?