nodeJS循環(huán)引用

最近在nodejs上由于一個(gè)exports使用方式方式不對(duì)導(dǎo)致在兩個(gè)不同js循環(huán)引用的情況下導(dǎo)致其中一個(gè)js無(wú)法獲取另外一個(gè)js的方法,從而導(dǎo)致執(zhí)行報(bào)錯(cuò),于是就去研究了一下nodeJs的循環(huán)引用。
官方給出了一個(gè)例子:

  • a.js:
exports.done = false;
const b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');
  • b.js:
console.log('b starting');
exports.done = false;
const a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');
  • main.js:
console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done = %j, b.done = %j', a.done, b.done);

上面可以看到在a.js中requireb.js, b.js中也require了a.js,兩者是循環(huán)引用, 當(dāng)執(zhí)行main.js的時(shí)候輸出如下:

$ node main.js
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done = true, b.done = true

main.js首先會(huì)load a.js, 此時(shí)執(zhí)行到const b = require('./b.js');的時(shí)候,程序會(huì)轉(zhuǎn)去loadb.js, 在b.js中執(zhí)行到const a = require('./a.js');,為了防止無(wú)限循環(huán),將a.jsexports的未完成副本返回到b.js模塊。然后b.js完成加載,并將其導(dǎo)出對(duì)象提供給a.js模塊。

我們知道nodeJs的對(duì)每個(gè)js文件進(jìn)行了一層包裝稱為module,module中有一個(gè)屬性exports,當(dāng)調(diào)用require('a.js')的時(shí)候其實(shí)返回的是module.exports對(duì)象,module.exports初始化為一個(gè){}空的object,所以在上面的例子中,執(zhí)行到b.jsconst a = require('./a.js');時(shí)不會(huì)load新的a module, 而是將已經(jīng)load但是還未完成的a module的exports屬性返回給b module,所以b.js拿到的是a module的exports對(duì)象,即:{done:false}, 雖然在a.js中exports.done被修改成了true,但是由于此時(shí)a.js未load完成,所以在b.js輸出的a module的屬性done為false,而在main.js中輸出的a module的屬性done為true. Nodejs通過(guò)上面這種返回未完成exports對(duì)象來(lái)解決循環(huán)引用的問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 模塊 Node 有簡(jiǎn)單的模塊加載系統(tǒng)。在 Node 里,文件和模塊是一一對(duì)應(yīng)的。下面例子里,foo.js加載同一個(gè)...
    保川閱讀 687評(píng)論 0 0
  • 最近新發(fā)現(xiàn)了一個(gè)在 NodeJS 中導(dǎo)致出現(xiàn)循環(huán)引用的可能情況。下面說(shuō)明一下。本來(lái)呢,如果直接在module.ex...
    _追隨_閱讀 1,781評(píng)論 0 0
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,246評(píng)論 0 38
  • JavaScript 標(biāo)準(zhǔn)參考教程(alpha) 草稿二:Node.js CommonJS規(guī)范 GitHub TO...
    鑨的傳人閱讀 501評(píng)論 0 1
  • 模塊通常是指編程語(yǔ)言所提供的代碼組織機(jī)制,利用此機(jī)制可將程序拆解為獨(dú)立且通用的代碼單元。所謂模塊化主要是解決代碼分...
    MapleLeafFall閱讀 1,255評(píng)論 0 0

友情鏈接更多精彩內(nèi)容