我正在尝试实现模块化模式:
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(),但mod2应该在mod1之后“定义”,如上所示。
答案 0 :(得分:1)
问题是你正在使用立即执行的闭包。这是新的' obj'并放置' undefined' mod2并将其填充到whichMod函数中。当您稍后调用该函数时,它无法更新未定义的引用。原因'这个' work是因为你正在返回有权访问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
});