因此,在意识到“相互递归”的替代名称是“循环依赖”之后,我在网上找到了一些参考资料(特别是有关该主题的require.js 手册页)。
简短的总结是:不,这不起作用。有多种方法可以绕过它,但它从根本上不是 Just Work。
最简单的解决方法是使用显式同步require()
调用来中断依赖链:
define(
["require", "NotLoadedYet"],
function (require, NLY)
{
// NLY is undefined here
return {
doSomething: function()
{
var realNLY = require("NotLoadedYet"); // fetch the real NLY on demand
realNLY.doSomething(); // actuall call the method
}
};
}
);
显然,这只有在您可以保证 NotLoadedYet 在您调用该方法时确实已加载时才有效。
在已经进行动态后期绑定的语言中使用动态后期绑定的想法非常新,但它确实有效。叹。似乎有一种稍微少一点的 ew 技术,它涉及改为使用 requirejs 的 CommonJS 支持,但我不知道它是如何工作的,所以我坚持这一点。
我实际上要做的是实现一个包含实现的 NotLoadedYetImpl 模块和一个通过上述机制代理的 NotLoadedYet 模块。遗憾的是,Javascript 没有对对象的所有属性执行 getter 和 setter,或者我也可以自动完成所有操作......