我正在尝试实现模块化模式:

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
});

07-24 17:15