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 );
}
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 递归|两个函数名
- 有没有一种方法可以在Javascript中进行可变递归currying
- 如何对不同的表递归使用以下代码
- 将jQuery对象传递到setTimeout递归函数中
- 有更好的方法吗?(递归解析HTML unicode实体)
- 为什么递归生成器函数没有't在ES2015工作
- 使用递归实现加性持久性
- 递归显示n元树
- 无递归的异步循环
- CommonJS递归导入很奇怪