当有循环require调用时,模块在返回时可能尚未完成执行。
javascript
// a.js
const b = require("./b.js");
console.log(b);
exports.name = "a";javascript
// b.js
const a = require("./a.js");
console.log(a);
exports.name = "b";执行node a.js,会先后打印{} { name: "b" }。
a模块加载了 b 模块 ,b 模块又加载了 a 模块,他俩之间存在循环加载。
在 b 加载 a 的时候, a 模块还没导出(exports)呢!
为了防止无限循环,会将 a 导出对象的 未完成的副本 返回给 b 模块,在这个例子中,a 导出对象未完成的副本为一个空对象{},所以会先打印{}
紧接着 b 为导出对象设置了一个 name 属性,console.log(b)语句把 b 的导出对象打印出来{ name: "b" }
如果我们在a.js中,再加一行代码这样的代码
javascript
// a.js
exports.age = 18;
const b = require("./b.js");
console.log(b);
exports.name = "a";执行node a.js,会先后打印{ age: 18 } { name: "b" }。
{ age: 18 } 即为 a 导出对象的 未完成的副本