CommonJS递归导入的奇怪之处
Strange thing with CommonJS recursive importing
我不知道问题出在哪里:在 JavaScript VM 或其他东西中...但是在这个简单的程序中
m.js
console.log("main", require("./m1"));
m1.js
var M = require('./m2');
exports.m = {
m2: M.m,
test: "m1"
}
m2.js
var M = require('./m1');
exports.m = {
m1: M.m,
test: "m2"
}
console.log("m2", M);
setTimeout(function() {
console.log("m2 nexttick", M);
}, 0);
我得到一个奇怪的输出。
m2 {}
main { m: { m2: { m1: undefined, test: 'm2' }, test: 'm1' } }
m2 nexttick { m: { m2: { m1: undefined, test: 'm2' }, test: 'm1' } }
有人可以解释一下吗?为什么异步填充对象?
这是 require 函数的伪造版本,以说明发生这种情况的原因。
当您在模块上调用 require
时,它会在缓存中创建一个空模块。然后,它尝试评估模块。如果您需要那个模块的另一个模块,而另一个模块 require
是原始模块,它将得到空模块,因为第一个模块 尚未完成评估 。
我在这里的回答非常有限,但您可以找到关于循环依赖的完整文章。
var cache = { };
function require(moduleName) {
if ( cache.hasOwnProperty(moduleName) )
return cache[moduleName]
cache[moduleName] = undefined;
cache[moduleName] = evaluate( moduleName );
}
我不知道问题出在哪里:在 JavaScript VM 或其他东西中...但是在这个简单的程序中
m.js
console.log("main", require("./m1"));
m1.js
var M = require('./m2');
exports.m = {
m2: M.m,
test: "m1"
}
m2.js
var M = require('./m1');
exports.m = {
m1: M.m,
test: "m2"
}
console.log("m2", M);
setTimeout(function() {
console.log("m2 nexttick", M);
}, 0);
我得到一个奇怪的输出。
m2 {}
main { m: { m2: { m1: undefined, test: 'm2' }, test: 'm1' } }
m2 nexttick { m: { m2: { m1: undefined, test: 'm2' }, test: 'm1' } }
有人可以解释一下吗?为什么异步填充对象?
这是 require 函数的伪造版本,以说明发生这种情况的原因。
当您在模块上调用 require
时,它会在缓存中创建一个空模块。然后,它尝试评估模块。如果您需要那个模块的另一个模块,而另一个模块 require
是原始模块,它将得到空模块,因为第一个模块 尚未完成评估 。
我在这里的回答非常有限,但您可以找到关于循环依赖的完整文章。
var cache = { };
function require(moduleName) {
if ( cache.hasOwnProperty(moduleName) )
return cache[moduleName]
cache[moduleName] = undefined;
cache[moduleName] = evaluate( moduleName );
}