問題描述
兩個JS文件存在循環(huán)import時,將導(dǎo)致undefined問題
import Type from "./test"
console.log(Type.Image); //這里報錯,說Type是個undefined,不能去取它的Image屬性
原因分析
如下兩個js,假定先加載a.js:
//a.js
console.log("before import b")
import {b} from "./b"
console.log("b is " + b)
export let a = b+1;
//b.js
console.log("before import a")
import {a} from "./a"
console.log("a is " + a)
export let b = a+1;
結(jié)果是
before import a
a is undefined
before import b
b is NAN
這里有一個有趣的現(xiàn)象就是第一句輸出并不是before import b,也就是雖然import語句在后面,但確會更早執(zhí)行,當(dāng)執(zhí)行import b時,加載并運(yùn)行b.js,從而第一句輸出是before import a。
然后就是當(dāng)運(yùn)行b.js時,發(fā)現(xiàn)又需要import a.js,此時不會再去加載a.js了,而是認(rèn)為整個a.js模塊是{},所以a的值就是undefined了。
如何避免
對于像constants, enum, global等一些需要立即執(zhí)行的模塊,定義Constants.js公共文件,從而避免循環(huán)依賴。