ES6 學(xué)習(xí)筆記(17) Module 的語法

1. 概述


由于 ES6 模塊是編譯時加載,使得靜態(tài)分析成為可能。有了它,就能進一步拓寬 JavaScript 的語法,比如引入宏(macro)和類型檢驗(type system)這些只能靠靜態(tài)分析實現(xiàn)的功能偿短。

除了靜態(tài)加載帶來的各種好處,ES6 模塊還有以下好處馋没。

不再需要UMD模塊格式了昔逗,將來服務(wù)器和瀏覽器都會支持 ES6 模塊格式。目前篷朵,通過各種工具庫勾怒,其實已經(jīng)做到了這一點。
將來瀏覽器的新 API 就能用模塊格式提供款票,不再必須做成全局變量或者navigator對象的屬性控硼。
不再需要對象作為命名空間(比如Math對象),未來這些功能可以通過模塊提供艾少。

2. 嚴格模式


ES6 的模塊自動采用嚴格模式卡乾,不管你有沒有在模塊頭部加上"use strict";。
嚴格模式主要有以下限制缚够。

變量必須聲明后再使用
函數(shù)的參數(shù)不能有同名屬性幔妨,否則報錯
不能使用with語句
不能對只讀屬性賦值,否則報錯
不能使用前綴0表示八進制數(shù)谍椅,否則報錯
不能刪除不可刪除的屬性误堡,否則報錯
不能刪除變量delete prop,會報錯雏吭,只能刪除屬性delete global[prop]
eval不會在它的外層作用域引入變量
evalarguments不能被重新賦值
arguments不會自動反映函數(shù)參數(shù)的變化
不能使用arguments.callee
不能使用arguments.caller
禁止this指向全局對象
不能使用fn.callerfn.arguments獲取函數(shù)調(diào)用的堆棧
增加了保留字(比如protected锁施、staticinterface

3. export 命令


模塊功能主要由兩個命令構(gòu)成:exportimportexport命令用于規(guī)定模塊的對外接口,import命令用于輸入其他模塊提供的功能悉抵。

  // 寫法一
  export var m = 1;

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

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

最后肩狂,export命令可以出現(xiàn)在模塊的任何位置,只要處于模塊頂層就可以姥饰。如果處于塊級作用域內(nèi)傻谁,就會報錯,下一節(jié)的import命令也是如此列粪。這是因為處于條件代碼塊之中审磁,就沒法做靜態(tài)優(yōu)化了,違背了 ES6 模塊的設(shè)計初衷岂座。

4. import 命令


使用export命令定義了模塊的對外接口以后态蒂,其他 JS 文件就可以通過import命令加載這個模塊。
最后费什,import語句會執(zhí)行所加載的模塊吃媒,因此可以有下面的寫法。

  import { foo } from 'my_module';
  import { bar } from 'my_module';
  // 等同于
  import { foo, bar } from 'my_module';

5. 模塊的整體加載


除了指定加載某個輸出值吕喘,還可以使用整體加載,即用星號(*)指定一個對象刑桑,所有輸出值都加載在這個對象上面氯质。

  // circle.js  導(dǎo)出模塊

  export function area(radius) {
    return Math.PI * radius * radius;
  }

  export function circumference(radius) {
    return 2 * Math.PI * radius;
  }
  // 整體引入
  import * as circle from './circle';
  console.log('圓面積:' + circle.area(4));
  console.log('圓周長:' + circle.circumference(14));

6. export default 命令


為了給用戶提供方便,讓他們不用閱讀文檔就能加載模塊祠斧,就要用到export default命令闻察,為模塊指定默認輸出。

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

  // 或者寫成

  function foo() {
    console.log('foo');
  }

  export default foo;

如果想在一條import語句中琢锋,同時輸入默認方法和其他接口辕漂,可以寫成下面這樣。

  import _, { each, each as forEach } from 'lodash';

7. export 與 import 的復(fù)合寫法


如果在一個模塊之中吴超,先輸入后輸出同一個模塊钉嘹,import語句可以與export語句寫在一起。

  export { foo, bar } from 'my_module';

  // 可以簡單理解為
  import { foo, bar } from 'my_module';
  export { foo, bar };

模塊的接口改名和整體輸出鲸阻,也可以采用這種寫法跋涣。

  export { es6 as default } from './someModule';

  // 等同于
  import { es6 } from './someModule';
  export default es6;

8. 模塊的繼承


假設(shè)有一個circleplus模塊,繼承了circle模塊鸟悴。

  // circleplus.js

  export * from 'circle';
  export var e = 2.71828182846;
  export default function(x) {
    return Math.exp(x);
  }

9. 跨模塊常量


本書介紹 const 命令的時候說過陈辱, const 聲明的常量只在當(dāng)前代碼塊有效。如果想設(shè)置跨模塊的常量(即跨多個文件)细诸,或者說一個值要被多個模塊共享沛贪,可以采用下面的寫法。

  // constants.js 模塊
  export const A = 1;
  export const B = 3;
  export const C = 4;

  // test1.js 模塊
  import * as constants from './constants';
  console.log(constants.A); // 1
  console.log(constants.B); // 3

  // test2.js 模塊
  import {A, B} from './constants';
  console.log(A); // 1
  console.log(B); // 3

10. import()


因此,有一個提案利赋,建議引入import()函數(shù)水评,完成動態(tài)加載。
import()返回一個 Promise 對象隐砸。下面是一個例子之碗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市季希,隨后出現(xiàn)的幾起案子褪那,更是在濱河造成了極大的恐慌,老刑警劉巖式塌,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件博敬,死亡現(xiàn)場離奇詭異,居然都是意外死亡峰尝,警方通過查閱死者的電腦和手機偏窝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來武学,“玉大人祭往,你說我怎么就攤上這事』鹬希” “怎么了硼补?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熏矿。 經(jīng)常有香客問我已骇,道長,這世上最難降的妖魔是什么票编? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任褪储,我火速辦了婚禮,結(jié)果婚禮上慧域,老公的妹妹穿的比我還像新娘鲤竹。我一直安慰自己,他們只是感情好昔榴,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布宛裕。 她就那樣靜靜地躺著,像睡著了一般论泛。 火紅的嫁衣襯著肌膚如雪揩尸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天屁奏,我揣著相機與錄音岩榆,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛勇边,可吹牛的內(nèi)容都是我干的犹撒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粒褒,長吁一口氣:“原來是場噩夢啊……” “哼识颊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奕坟,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祥款,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后月杉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刃跛,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年苛萎,在試婚紗的時候發(fā)現(xiàn)自己被綠了桨昙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡腌歉,死狀恐怖蛙酪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翘盖,我是刑警寧澤滤否,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站最仑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炊甲。R本人自食惡果不足惜泥彤,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卿啡。 院中可真熱鬧吟吝,春花似錦、人聲如沸颈娜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽官辽。三九已至蛹磺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間同仆,已是汗流浹背萤捆。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俗或。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓市怎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辛慰。 傳聞我的和親對象是個殘疾皇子区匠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • ES6模塊不是對象,而是export命令顯示指定輸出的代碼帅腌,輸入時也采用靜態(tài)命令的形式驰弄。 上面是從fs模塊里加載3...
    竹天亮閱讀 7,543評論 2 17
  • 以下內(nèi)容是我在學(xué)習(xí)和研究ES6時,對ES6的特性狞膘、重點和注意事項的提取揩懒、精練和總結(jié),可以做為ES6特性的字典挽封;在本...
    科研者閱讀 3,126評論 2 9
  • [TOC] 參考阮一峰的ECMAScript 6 入門參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,781評論 0 1
  • 模塊通常是指編程語言所提供的代碼組織機制已球,利用此機制可將程序拆解為獨立且通用的代碼單元。所謂模塊化主要是解決代碼分...
    MapleLeafFall閱讀 1,170評論 0 0
  • 三國時期辅愿,魏國的勢力強大后智亮,曹操年邁已衰,眼下有兩個他還看好的繼承人点待,一個是曹丕阔蛉,另一個就是曹植。 曹植天生就聰慧...
    接近真理閱讀 1,373評論 2 4