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

    例如以下情况:

    a.js:

    1. console.log('a 开始');
    2. exports.done = false;
    3. const b = require('./b.js');
    4. console.log('在 a 中,b.done = %j', b.done);
    5. exports.done = true;
    6. console.log('a 结束');

    b.js:

    1. console.log('b 开始');
    2. exports.done = false;
    3. const a = require('./a.js');
    4. console.log('在 b 中,a.done = %j', a.done);
    5. exports.done = true;
    6. console.log('b 结束');

    main.js:

    1. console.log('main 开始');
    2. const a = require('./a.js');
    3. const b = require('./b.js');
    4. 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.jsexports 对象的 未完成的副本b.js 模块。 然后 b.js 完成加载,并将 exports 对象提供给 a.js 模块。

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

    1. $ node main.js
    2. main 开始
    3. a 开始
    4. b 开始
    5. b 中,a.done = false
    6. b 结束
    7. a 中,b.done = true
    8. a 结束
    9. main 中,a.done=trueb.done=true

    需要仔细的规划, 以允许循环模块依赖在应用程序内正常工作.