模块化开发(一)javascript
ES6 的模块自动采用严格模式,无论你有没有在模块头部加上"use strict"。
顶层的this指向undefined,即不该该在顶层代码使用this。html
严格模式主要有如下限制:java
with
语句delete prop
,会报错,只能删除属性delete global[prop]
eval
不会在它的外层做用域引入变量eval
和arguments
不能被从新赋值arguments.callee
arguments.caller
fn.caller
和fn.arguments
获取函数调用的堆栈protected
、static
和interface
)export
除了输出变量,还能够输出函数或类(class),还能够经过 as
更改输出名。let age = 18; let obj ={name: "Owen"}; let multiply = (x, y) => x * y; export { age, obj as monicker, //改变量名 multiply }
let num =2; export num ; //error 由于实际输出的是一个值,须放在对象中 {num} exprot 2 //error 输出的是值 而不是一个对外接口 => 须改为 export let num =2;
let foo = (r) => r++; let fn = () => export default foo; //error
export default
export default
后面不能有 变量声明的关键字export default
,import 就不须要使用 {}
,只须要自定义一个变量便可export default var a=1; //error export default obj ={name:'Owen'}; //or let num = 1; let obj1 = {name:"Owen"}; export default {num, obj1}
import
from
导入模块, 经过 as
修改导入接口, 接口不能从新赋值,但对象能够修改内部属性或方法。import {age, monicker as obj, multiply} from './preson.js'; age = 0 ; //error obj.feature = "handsome Owen"; console.log(age, obj。name, multiply(1,2)) import * as preson from "./preson.js" //引入全部接口
import
具备提高的效果,会提高到做用域顶部执行,同一个模块屡次引入只执行一次,而且不能再局部做用域中引入。multiply(2,2); //4 import {age, monicker as obj, multiply} from './preson.js'; if (true){ import {age, monicker as obj, multiply} from './preson.js'; //error }
import()
import()
函数,完成动态加载。require
相似,不一样之处在于 import()
是同步加载 require()
是异步加载const path =import('path');
咱们能够利用 import()
进行按需加载,动态加载,按条件加载:es6
```javascript import('./a.js') .then(r => { r.fn(); }) .catch(error => { /* Error handling */ }) if( x == 1){ const path =import('path'); } ```
Promise.all([ import('./a.js'), import('./b.js'), import('./c.js'), ]) .then(([a,b,c]) => { // ... }).catch(error => { /* Error handling */ })