initModule()
循環参照のため、require.jsが「a」の前提条件として「b」をロードしている場合、aはまだ呼び出されていないため、「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();
}
};
}
);
ところで、一般的に循環参照は悪い設計の兆候ですが、常にそうであるとは限りません。たとえば、ウィジェットファクトリモジュールを実装しました。このモジュールは、特に「コンテナウィジェット」モジュールを参照し、コンテンツを作成するためにファクトリを参照する必要がありました。完全に合法です。