似乎使用下面的javascript模块模式,不可能有相互依赖的模块:
var AA = (function(module, BB){
module.sayHello = function(){
alert("AA: hello!");
};
module.pokeYourFriend = function(){
BB.sayHello();
};
return module;
})(AA || {}, BB);
var BB = (function(module, AA){
module.sayHello = function(){
alert("BB: hello!");
};
module.pokeYourFriend = function(){
AA.sayHello();
};
return module;
})(BB || {}, AA);
> AA.pokeYourFriend();
*TypeError: Cannot call method 'sayHello' of undefined*
以上失败,因为 AA 创建时 BB 不存在。
是否有一种模式允许这样做,或者应该禁止相互依赖?
最佳答案
AA
和BB
的RHS 值是函数表达式,它们按自上而下的顺序求值(这是Javascript 中的正常顺序)。因此,在定义 BB
之前,您不能使用 BB
。
您可以使用“构造函数”来创建这些模块并为其分配名称(“AA”或“BB”),而不是 self 调用:
var create = (function(name) {
var _friend = null;
var _name = name;
return {
sayHello: function() {
alert(_name + ": hello!");
},
pokeYourFriend: function() {
if(_friend != null) {
_friend.sayHello();
}
},
setFriend: function(friend) {
_friend = friend;
}
};
});
var AA = create("AA");
var BB = create("BB");
AA.setFriend(BB);
BB.setFriend(AA);
AA.pokeYourFriend(); //alerts "BB: hello!"
BB.pokeYourFriend(); //alerts "AA: hello!"
关于支持相互依赖的javascript模块模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4749690/