ES6中的export命令

模塊功能主要由兩個命令構成:export和import。export命令用于規定模塊的對外接口,import命令用于輸入其他模塊提供的功能。

一個模塊就是一個獨立的文件。該文件內部的所有變量,外部無法獲取。如果你希望外部能夠讀取模塊內部的某個變量,就必須使用export關鍵字輸出該變量。下面是一個 JS 文件,里面使用export命令輸出變量。


// profile.js

exportvarfirstName='Michael';

exportvarlastName='Jackson';

varyear=1958;

export{firstName,lastName,year};

上面代碼在export命令后面,使用大括號指定所要輸出的一組變量。它與前一種寫法(直接放置在var語句前)是等價的,但是應該優先考慮使用這種寫法。因為這樣就可以在腳本尾部,一眼看清楚輸出了哪些變量。

export命令除了輸出變量,還可以輸出函數或類(class)。

export function multiply(x, y) {
  return x * y;
};

上面代碼對外輸出一個函數multiply。

通常情況下,export輸出的變量就是本來的名字,但是可以使用as關鍵字重命名。

function v1() { ... }
function v2() { ... }

export {
  v1 as streamV1,
  v2 as streamV2,
  v2 as streamLatestVersion
};

上面代碼使用as關鍵字,重命名了函數v1和v2的對外接口。重命名后,v2可以用不同的名字輸出兩次。

需要特別注意的是,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語句輸出的接口,與其對應的值是動態綁定關系,即通過該接口,可以取到模塊內部實時的值。

export var foo = 'bar';
setTimeout(() => foo = 'baz', 500);

上面代碼輸出變量foo,值為bar,500毫秒之后變成baz。

這一點與 CommonJS 規范完全不同。CommonJS 模塊輸出的是值的緩存,不存在動態更新,詳見下文《Module 的加載實現》一節。

最后,export命令可以出現在模塊的任何位置,只要處于模塊頂層就可以。如果處于塊級作用域內,就會報錯,下一節的import命令也是如此。這是因為處于條件代碼塊之中,就沒法做靜態優化了,違背了ES6模塊的設計初衷。

function foo() {
  export default 'bar' // SyntaxError
}
foo()

上面代碼中,export語句放在函數之中,結果報錯。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • ES6模塊不是對象,而是export命令顯示指定輸出的代碼,輸入時也采用靜態命令的形式。 上面是從fs模塊里加載3...
    竹天亮閱讀 7,606評論 2 17
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,218評論 2 33
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,251評論 25 708
  • 喜歡你在不知不覺中,沒有固定的起始日期,自然也沒有喜歡你的第多少天更沒有什么幾周年去紀念。今天寫下這些文字...
    Z天使Y惡魔閱讀 152評論 0 0
  • 直到今天,或許他還是不知道我為什么離開他。他覺得這個女人變了,忽然一下子變得陌生,而且不熟悉。 我們曾經也相愛過...
    susa11閱讀 532評論 0 51