首先,執行a.mjs以後,引擎發現它載入了b.mjs,因此會優先執行b.mjs,然後再執行a.mjs。接著,執行b.mjs的時候,已知它從a.mjs輸入了foo介面,這時不會去執行a.mjs,而是認為這個介面已經存在了,繼續往下執行。總是先執行依賴是正確的,但是發現迴圈的時候,並不會繼續執行下去。
而是認為這個介面以存在這個介面確實存在了。module 執行分 parse, instantiate, evaluate 幾步。
parse 解析整個源**,並收集依賴,以及所有被匯入、匯出的名字。
instantiate 遞迴地載入依賴(parse + instatntiate),並建立所有全域性變數、匯入符號地繫結。(至此,foo
的繫結已經存在了)注意此步並不會執行**。
模組間匯入的繫結只知道模組間名字的對應就可以了,迴圈引用並不是問題,因為每個模組都有自己的匯入匯出的名字列表。
全域性變數繫結的時候,初始化規則與其它地方是一樣的:var 初始化為undefined
,let 不初始化,函式直接初始化為函式本身。所以,foo
的繫結是存在的,並且可以被其它匯入了此符號的模組找到,但是,並沒有初始化,所以不能讀寫。
evaluate 開始遞迴的執行**(被匯入的先執行),遞迴在沒有依賴或遇到迴圈的時候停止。所以 b.mjs 先執行。a.mjs 由於還沒有執行,foo
還處在沒有初始化的狀態(let 變數要執行到變數宣告處才初始化),所有出錯。
用現在的 node 的話,import 要寫from "./a.mjs"
,副檔名不能省略。
然後,錯誤資訊是:
referenceerror: cannot access 'foo' before initialization
不能訪問未初始化的變數。 ES6 模組載入
es6中的import 是singleton 的載入方式只會載入一次,並且是編譯是執行,在編譯時進行運算等是會報錯的 export 註冊介面 export 使用方法 import 引入介面 import import from profile.js 介面可以整體載入 載入方式如下 import as...
es6模組暴露
es6模組匯入和匯出 匯出 export,export default 可以匯出變數,函式,物件,檔案,模組 匯入 import function add 1 export add 匯入 import from add.js 匯入時要加,呼叫 add 可以匯出多個,加 export export a...
es6模組命令
es6的模組命令分為export命令和import命令,其中export命令用於匯出變數,import命令用於引入變數。1.1a檔案 export var name name export var age 1 以上a檔案中使用export命令匯出了name和age變數。下面,將在b檔案中使用impo...