CommonJS模块的循环加载

640?wx_fmt=png

当循环调用 require() 时,一个模块可能在未完成执行时被返回。

例如以下情况:

// a.js	
console.log('a 开始');	
exports.done = false;	
const b = require('./b.js');	
console.log('在 a 中,b.done = %j', b.done);	
exports.done = true;	
console.log('a 结束');
// b.js	
console.log('b 开始');	
exports.done = false;	
const a = require('./a.js');	
console.log('在 b 中,a.done = %j', a.done);	
exports.done = true;	
console.log('b 结束');
// main,js	
console.log('main 开始');	
const a = require('./a.js');	
const b = require('./b.js');	
console.log('在 main 中,a.done=%j,b.done=%j', a.done, b.done);

当 main.js 加载 a.js 时, a.js 又加载 b.js

此时, b.js 会尝试去加载 a.js。为了防止无限的循环,会返回一个 a.js 的 exports 对象的 未完成的副本 给 b.js 模块。

然后 b.js 完成加载,并将 exports 对象提供给 a.js 模块。

当 main.js 加载这两个模块时,它们都已经完成加载。因此,该程序的输出会是:

main 开始	
a 开始	
b 开始	
在 b 中,a.done = false	
b 结束	
在 a 中,b.done = true	
a 结束	
在 main 中,a.done=true,b.done=true

640?wx_fmt=png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值