我正在尝试实现模块化模式:
var mod1, mod2;
mod1 = (function (mod2) {
var obj = {};
obj.whichMod = function () {
mod2.whichMod();
};
return obj;
}(mod2));
mod2 = (function (mod1) {
var obj = {};
obj.whichMod = function () {
console.log('mod2');
}
return obj;
}(mod1));
mod1.whichMod();
当我调用mod1.whichMod()方法时,它说mod2不是未定义的。为什么是这样?
我想让mod1.whichMod()调用mod2.whichMod(),但如上所示,应该在mod1之后“定义” mod2。
最佳答案
问题是您正在使用立即执行的闭包。这是使用新的'obj'并将'undefined'mod2填充到whichMod函数中。当您以后去调用该函数时,它无法更新未定义的引用。之所以如此,是因为您要返回的实际闭包具有对mod2变量的访问权,然后您可以在稍后定义。这样就可以更新mod2。以下是未更新的示例。
jsFiddle:http://jsfiddle.net/lookitstony/fzsodx85/
var mod1, mod2;
mod2 = {};
mod2.whichMod = function(){ console.log('first') };
mod1 = (function (mod2) {
var obj = {};
obj.whichMod = function () {
mod2.whichMod();
};
return obj;
}(mod2));
mod2 = (function (mod1) {
var obj = {};
obj.whichMod = function () {
console.log('mod2');
}
return obj;
}(mod1));
$(function(){
mod1.whichMod(); // mod2 did not exist so its using the one defined above
mod2.whichMod(); // mod2 is now overwritten but....
mod1.whichMod(); // mod1 still has the original object passed in
});