Module

一、严格模式

  1、严格模式的限制

  • 变量必须声明后再使用
  • 函数的参数不能有同名属性,否则报错
  • 不能使用with语句
  • 不能对只读属性赋值,否则报错
  • 不能使用前缀0表示八进制数,否则报错
  • 不能删除不可删除的属性,否则报错
  • 不能删除变量delete prop,会报错,只能删除属性delete global[prop]
  • eval不会在它的外层作用域引入变量
  • evalarguments不能被重新赋值
  • arguments不会自动反映函数参数的变化
  • 不能使用arguments.callee
  • 不能使用arguments.caller
  • 禁止this指向全局对象
  • 不能使用fn.callerfn.arguments获取函数调用的堆栈
  • 增加了保留字(比如protectedstaticinterface

二、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
posted @ 2016-06-05 12:14  DeadGhost  阅读(146)  评论(0编辑  收藏  举报