2015-10-14 37 views
1

奇怪的事情,我不知道哪裏是問題:在JavaScript虛擬機或別的東西......但在這個簡單的程序與CommonJS的遞歸進口

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' } } 

有人可以解釋這一點嗎?爲什麼對象是異步填充的?

回答

2

以下是require函數的假版本,以說明發生這種情況的原因。

當您在模塊上調用require時,它會在緩存中創建一個空模塊。然後,它嘗試評估模塊。如果您需要另一個模塊,而其他模塊require是原始模塊,則它將獲得空模塊,因爲第一個模塊尚未完成評估

我在這裏的答案是非常有限的,但你可以找到關於循環依賴整個文章。

var cache = { }; 
function require(moduleName) { 
    if (cache.hasOwnProperty(moduleName)) 
     return cache[moduleName] 
    cache[moduleName] = undefined; 
    cache[moduleName] = evaluate(moduleName); 
}