严格模式

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)

上面这些限制,模块都必须遵守。由于严格模式是 ES5 引入的,不属于 ES6
其中,尤其需要注意this的限制。

ES6 模块之中,顶层的this指向undefined,即不应该在顶层代码使用this。

export 命令

模块功能主要由两个命令构成:export和import。

  • export命令用于规定模块的对外接口,
  • import命令用于输入其他模块提供的功能。

一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量。

需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。


// 报错
export 1;
// 报错
var m = 1;
export m;

// 正确写法:
// 写法一
export var m = 1;

// 写法二
var m = 1;
export {m};

// 写法三
var n = 1;
export {n as m};

同样的,function和class的输出,也必须遵守这样的写法。

import 命令

使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。

// b.js
import {a1, a2, a3} from './a.js';

//import * as a from './a.js';

//读取是用a.a1、a.a2
function b() {
this.name = a1 + ' ' + a2;
}

上面代码的import命令,用于加载profile.js文件,并从中输入变量。import命令接受一对大括号,里面指定要从其他模块导入的变量名。大括号里面的变量名,必须与被导入模块(profile.js)对外接口的名称相同。

如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名。

import { lastName as surname } from './profile.js';

export default 命令

注意: 上面报错的导出方式如果加上default,就不会报错

export default命令用于指定模块的默认输出。显然,一个模块只能有一个默认输出,因此export default命令只能使用一次。所以,import命令后面才不用加大括号,因为只可能唯一对应export default命令。

本质上,export default就是输出一个叫做default的变量或方法,然后系统允许你为它取任意名字。

// c.js
export default function () {
console.log('foo');
}
// d.js

import fn from './c';//这个fn指向c的默认导出

关于ArrayBuffer,直接看这