ElemeFE/node-interview

模块章节中关于循环require的一个问题

h2jorm opened this issue · 1 comments

原文关于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的术语。

这个解释要看是给谁看吧,给不了解模块机制的人看得话,直接写 {} 是最简单的,表明拿到的就是未初始化的 module.exports。要写详细版,需要突出的是从 “未初始化” (uninitialized) 到 “未完成初始化” (unfinished) 的区别。一般面试不会问的这么细(也不太好问),为了方便理解排版都可能需要改一下(就改那一两个词会让新人看不懂的),回头抽时间改。