ES6 的模塊自動采用嚴格模式,不管你有沒有在模塊頭部加上"use strict";
。
嚴格模式主要有以下限制。
- 變量必須聲明后再使用
- 函數的參數不能有同名屬性,否則報錯
- 不能使用
with
語句 - 不能對只讀屬性賦值,否則報錯
- 不能使用前綴 0 表示八進制數,否則報錯
- 不能刪除不可刪除的屬性,否則報錯
- 不能刪除變量
delete prop
,會報錯,只能刪除屬性delete global[prop]
eval
不會在它的外層作用域引入變量eval
和arguments
不能被重新賦值arguments
不會自動反映函數參數的變化- 不能使用
arguments.callee
- 不能使用
arguments.caller
- 禁止
this
指向全局對象 - 不能使用
fn.caller
和fn.arguments
獲取函數調用的堆棧 - 增加了保留字(比如
protected
、static
和interface
)
1,export命令導出必須以接口(變量)的方式,不能導出值的方式;
2,export,import
命令可以出現在模塊的任何位置,只要處於模塊頂層就可以。如果處於塊級作用域內,就會報錯。因為處於條件代碼塊之中,就沒法做靜態優化了,違背了 ES6 模塊的設計初衷;
3,import
命令接受一對大括號,里面指定要從其他模塊導入的變量名。大括號里面的變量名,必須與被導入模塊對外接口的名稱相同;
4,import
命令輸入的變量都是只讀的,因為它的本質是輸入接口;
5,import
命令具有提升效果,會提升到整個模塊的頭部,首先執行;
6,由於import
是靜態執行,所以不能使用表達式和變量,這些只有在運行時才能得到結果的語法結構;
7,使用import
命令的時候,用戶需要知道所要加載的變量名或函數名,否則無法加載。但是,用戶肯定希望快速上手,未必願意閱讀文檔,去了解模塊有哪些屬性和方法。為了給用戶提供方便,讓他們不用閱讀文檔就能加載模塊,就要用到export default
命令,為模塊指定默認輸出;
8,正是因為export default
命令其實只是輸出一個叫做default
的變量,所以它后面不能跟變量聲明語句,因為export default
命令的本質是將后面的值,賦給default
變量,所以可以直接將一個值寫在export default
之后;
9,import()
函數可以用在任何地方,不僅僅是模塊,非模塊的腳本也可以使用。它是運行時執行,也就是說,什么時候運行到這一句,就會加載指定的模塊。另外,import()
函數與所加載的模塊沒有靜態連接關系,這點也是與import
語句不相同。import()
類似於 Node 的require
方法,區別主要是前者是異步加載,后者是同步加載。