Из-за циклической ссылки, когда require.js загружает «b» в качестве предварительного условия для «a», он не может вернуть значение для «a», потому что a's initModule()
еще не было вызвано.Однако ко времени вызова 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();
}
};
}
);
Кстати, в то время как в общие циклические ссылки являются признаком плохого дизайна, это не таквсегда так.Например, я реализовал модуль фабрики виджетов, который, помимо прочего, ссылался на модуль «контейнерного виджета», который затем должен был ссылаться на фабрику, чтобы создать ее содержимое.Совершенно законно.