Appearance
注意事项
本节目标:理解“注意事项”的核心思路,并能把它用于实际开发或面试表达。 一、
export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。export后面必须是
- 变量
- 函数
- 类声明
- 大括号批量导出语句;大括号语法有声明变量的作用,也就是将指定变量输出,同时指定其值;
- 不能是一个具体的值;
// 报错
export 1;
// 报错
var m = 1;
export m;
上面两种写法都会报错,因为没有提供对外的接口。第一种写法直接输出 `1`,第二种写法通过变量`m`,还是直接输出 `1`。`1`只是一个值,不是接口。正确的写法是下面这样。
// 写法一
export var m = 1;
// 写法二
var m = 1;
export {m};
// 写法三
var n = 1;
export {n as m};
上面三种写法都是正确的,规定了对外的接口`m`。其他脚本可以通过这个接口,取到值`1`。它们的实质是,在接口名与模块内部变量之间,建立了一一对应的关系。同样的,function和class的输出,也必须遵守这样的写法。 // 报错 function f() {} export f; // 正确 export function f() {}; // 正确 function f() {} export {f};
二、接口与模块内部变量是动态绑定关系:即通过该接口,可以取到模块内部实时的值。 export var foo = 'bar'; setTimeout(() => foo = 'baz', 500); 上面代码输出变量foo,值为bar,500 毫秒之后变成baz。
三、export命令可以出现在模块的任何位置,只要处于模块顶层就可以。如果处于块级作用域内,就会报错,下一节的import命令也是如此。这是因为处于条件代码块之中,就没法做静态优化了,违背了 ES6 模块的设计初衷。 function foo() { export default 'bar' // SyntaxError } foo() 上面代码中,export语句放在函数之中,结果报错。
