一、严格模式
1、严格模式的限制
- 变量必须声明后再使用
- 函数的参数不能有同名属性,否则报错
- 不能使用
with
语句 - 不能对只读属性赋值,否则报错
- 不能使用前缀0表示八进制数,否则报错
- 不能删除不可删除的属性,否则报错
- 不能删除变量
delete prop
,会报错,只能删除属性delete global[prop]
eval
不会在它的外层作用域引入变量eval
和arguments
不能被重新赋值arguments
不会自动反映函数参数的变化- 不能使用
arguments.callee
- 不能使用
arguments.caller
- 禁止
this
指向全局对象 - 不能使用
fn.caller
和fn.arguments
获取函数调用的堆栈 - 增加了保留字(比如
protected
、static
和interface
)
二、export和import命令
- import命令具有提升效果,会提升到整个模块的头部,首先执行
- import后面需要使用{}
三、模块的整体加载
- 用星号(
*
)指定一个对象,所有输出值都加载在这个对象上面 - 语法如下:
import * as objName from 'otehrModule';
四、export default命令
- 使用
import
命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载 //除整体加载使用* - export default命令,为模块指定默认输出
- 其他模块加载该模块时,
import
命令可以为该匿名函数指定任意名字 - 这时
import
命令后面,不使用大括号。
// 输出 export default function crc32() { // ... } // 输入 import crc32 from 'crc32'; // 输出 export function crc32() { // ... }; // 输入 import {crc32} from 'crc32';
五、模块的继承
六、ES6模块加载的实质
- ES6模块加载的机制,与CommonJS模块完全不同。CommonJS模块输出的是一个值的拷贝,而ES6模块输出的是值的引用
七、循环加载
- “循环加载”(circular dependency)指的是,
a
脚本的执行依赖b
脚本,而b
脚本的执行又依赖a
脚本 - 通常,“循环加载”表示存在强耦合,如果处理不好,还可能导致递归加载,使得程序无法执行,因此应该避免出现
八、CommonJS模块的加载原理
- CommonJS的一个模块,就是一个脚本文件。
require
命令第一次加载该脚本,就会执行整个脚本,然后在内存生成一个对象 - 需要用到这个模块的时候,就会到
exports
属性上面取值。即使再次执行require
命令,也不会再次执行该模块,而是到缓存之中取值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。 - CommonJS模块遇到循环加载时,返回的是当前已经执行的部分的值,而不是代码全部执行后的值,两者可能会有差异。所以,输入变量的时候,必须非常小心。
九、跨模块常量
十、ES6模块的转码
- Babel
- ES6 module transpiler
- SystemJS