nodejs中相互引用(迴圈引用)的模組分析

2022-08-25 23:00:21 字數 1414 閱讀 4539

話不多少,直接上原始碼吧:

moda.js:

module.exports.test = 'a';

const modb = require('./05_modb');

console.log( 'moda:', modb.test);

module.exports.test = 'aa';

modb.js:

module.exports.test = 'b';

const moda = require('./05_moda');

console.log( 'modb:', moda.test);

module.exports.test = 'bb';

main.js

const moda = require('./moda');
執行結果如下:

剛開始學習和閱讀上述**,是有點覺得暈暈乎乎,如果a與b存在相互依賴、相互引用關係,不就形成了乙個閉環或者說死迴圈?那程式怎麼會繼續解析呢?很顯然,執行結果告訴我們,nodejs引擎有自己的一套處理迴圈引用的機制。下面我們根據上述執行結果,來推演了兩個module模組的執行順序,以了解nodejs打破閉環的機制。

過程分解:

①執行moda第一行,輸出乙個test介面

②執行moda第二行,要引入modb此時斷點產生了,即開始執行modb裡的**, 程式開始走"breakpoint-out"路線

③執行modb第一行

④執行modb第二行,要因為moda,此步驟為打破閉環的關鍵,此時將a裡斷點之前的執行結果輸出給modb,如圖里的藍色虛線框標識的部分,此時在modb中列印moda.test,列印'a'

⑤繼續執行modb第三行

⑥繼續執行modb第四行,對外輸出test介面('bb'),此後,modb執行完畢,主程式返回至斷點處(moda中在②步驟產生的斷點),將modb的執行結果儲存在'modb' const變數中。

⑦執行moda的第三行

⑧執行moda的第四行,列印'modb'物件裡的test介面,根據中指向結果可知,'modb'返回的test介面為'bb',因此,列印'bb',程式結束。

如果main.js呼叫的是'modb.js',分析過程完全一致,列印的結果將是'b, aa'。

根據上述分析可知,nodejs中的模組互相引用形成的「閉環」其實是用「斷點」這一方式開啟的,以斷點為出口去執行其他模組,也以斷點為入口進行返回,之後繼續執行斷點之後的**。

——學無止境,保持好奇。may stars guide your way.

nodejs中的相互引用

有個a.js和b.js兩個檔案,它們在同個資料夾裡 a.js var b require b console.log b module.exports a b.js var a require a console.log a module.exports b 當我們在命令列中node b,會是什麼結...

NSTimer中的迴圈引用

void viewdidload void p dosomething void p stopdosomething void dealloc 上面的 主要是利用定時器重複執行p dosomething方法,在合適的時候呼叫p stopdosomething方法使定時器失效.scheduledtim...

Objective C中block迴圈引用問題詳解

目標 block執行過程中,self不會釋放 執行完可以釋放。最初block中直接使用self會強引用。self.myblock 或者使用了物件的屬性 self.myblock 程式設計客棧 在這樣的情況下,self強引用block,block也持有該物件,導致迴圈引用。要注意的是,只有在self強...