Javascript 使用模块模式,为什么引用未定义?

Javascript 使用模块模式,为什么引用未定义?,javascript,Javascript,我正在尝试实现模块化模式: var mod1, mod2; mod1 = (function (mod2) { var obj = {}; obj.whichMod = function () { mod2.whichMod(); }; return obj; }(mod2)); mod2 = (function (mod1) { var obj = {}; obj.whichMod = function () {

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

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之后“定义”,如上图所示。

问题在于您使用的闭包会立即执行。这是采用新的“obj”并将“undefined”mod2放入whichMod函数中。当您稍后调用该函数时,它无法更新未定义的引用。“this”起作用的原因是,您正在返回实际的闭包,该闭包可以访问稍后定义的mod2变量。这允许更新mod2。下面是一个未更新的示例

jsFiddle:


当您将mod2传递到闭包时,它还不存在。按照这种设置方式,如果您将mod2移到上面,您将面临相同的问题,因为mod1不存在。但在最后一行中:mod1.whichMod(),mod1和mod2都已创建。当我将mod2传递给mod1时,它不是通过引用传递的吗?奇怪的是,如果我将“obj”替换为“this”(例如:this.WhichMod=function(){}),它就可以工作了。是的,正在创建的obj中填充了“undefined”对象,然后返回。使用“this”,您只是返回仍然可以访问mod2的函数对象本身。这个链接会帮你省去麻烦。查看我提供的链接上的“显示模块模式”。我认为这会让你找到正确的位置,尽管我经常使用这个链接,它帮助我理解js模式。我仍然会遇到一些盖查,但它肯定会让你朝着正确的方向前进。
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
});