We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
A.js:
module.exports = 'A'; const B = require('./B'); console.log( 'A中的B:', B); module.exports = 'AA';
B.js:
module.exports = 'B'; const A = require('./A'); // "A" console.log( 'B中的A:', A); module.exports.test = 'BB';
如果A与B存在相互依赖、相互引用关系,不就形成了一个闭环或者说死循环?那程序怎么会继续解析呢?
很显然,运行结果告诉我们,nodejs引擎有自己的一套处理循环引用的机制。下面我们根据上述运行结果,来推演了两个module模块的执行顺序,以了解nodejs打破闭环的机制。
①执行modA第一行,输出一个test接口
modA
test
②执行modA第二行,要引入modB此时断点产生了,即开始执行modB里的代码, 程序开始走"breakpoint-out"路线
modB
"breakpoint-out"
③执行modB第一行
④执行modB第二行,要因为modA,此步骤为打破闭环的关键,此时将A里断点之前的执行结果输出给modB,如图里的蓝色虚线框标识的部分,此时在modB中打印modA.test,打印'A'
modA.test
'A'
⑤继续执行modB第三行
⑥继续执行modB第四行,对外输出test接口('BB'),此后,modB执行完毕,主程序返回至断点处(modA中在②步骤产生的断点),将modB的执行结果保存在'modB' const变量中。
'modB' const
⑦执行modA的第三行
⑧执行modA的第四行,打印'modB'对象里的test接口,根据中指向结果可知,'modB'返回的test接口为'BB',此,打印'BB',程序结束。
'modB'
'BB'
如果main.js调用的是'modB.js',分析过程完全一致,打印的结果将是'B, AA'。
main.js
'modB.js'
'B, AA'
根据上述分析可知,nodejs中的模块互相引用形成的**“闭环”其实是用“断点”**这一方式打开的,以断点为出口去执行其他模块,也以断点为入口进行返回,之后继续执行断点之后的代码。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Node.js相互引用模块执行机制
A.js:
B.js:
以为的执行流程
如果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中的模块互相引用形成的**“闭环”其实是用“断点”**这一方式打开的,以断点为出口去执行其他模块,也以断点为入口进行返回,之后继续执行断点之后的代码。
The text was updated successfully, but these errors were encountered: