由于循环引用,当 require.js 加载“b”作为“a”的先决条件时,它无法返回“a”的值,因为initModule()
尚未调用 a。然而,当b.somethingElse()
被调用时,模块“a”已经被初始化并且require("a")
调用将返回。
以下代码显示了两个模块内部的内容 - 它们的加载顺序无关紧要。我已经从 require.js 示例中对其进行了一些更改,以使其更加明显。
// Inside a.js:
define(["require", "b"],
function initModule(require) {
return {
doSomehingWithA: function() { ...},
doSomethingElse: function(title) {
// by the time this function is called,
// require("b") will properly resolve
return require("b").doSomethingWithB();
}
}
}
);
// Inside b.js:
define(["require", "a"],
function initModule(require) {
return {
doSomethingWithB: function() {...},
doSomethingElse: function(title) {
// by the time this function is called,
// require("a") will properly resolve
return require("a").doSomethingWithA();
}
};
}
);
顺便说一句,虽然一般循环引用是糟糕设计的征兆,但并非总是如此。例如,我实现了一个小部件工厂模块,除其他外,它引用了一个“容器小部件”模块,然后必须引用工厂才能创建其内容。完全合法。