模块章节中关于循环require的一个问题
h2jorm opened this issue · 1 comments
h2jorm commented
在原文关于a.js和b.js的相互require的问题讨论中提到
以从 a.js 启动为例, a.js 还没执行完 exports 就是 {} 在 b.js 的开头拿到的就是 {} 而已
这里可能没有考虑到a.js文件在require('./b.js')
之前就已经修改过module.exports
的情况。下面是一个从官方文档中找到并简化过的例子。
// a.js
exports.done = false;
const b = require('./b');
exports.done = true;
// b.js
const a = require('./a');
console.log('a = ', a);
// main.js
require('./a.js'); // a = {done: false}
所以当循环获取已经被require,但是没有被执行完的文件时,拿到的不一定是空对象,而是该文件的module.exports
拷贝,官方文档中使用了一个叫unfinished copy的术语。
Lellansin commented
这个解释要看是给谁看吧,给不了解模块机制的人看得话,直接写 {}
是最简单的,表明拿到的就是未初始化的 module.exports。要写详细版,需要突出的是从 “未初始化” (uninitialized) 到 “未完成初始化” (unfinished) 的区别。一般面试不会问的这么细(也不太好问),为了方便理解排版都可能需要改一下(就改那一两个词会让新人看不懂的),回头抽时间改。