模塊化開發(一)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 */ })