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

时间:2014-09-12 17:20:44

标签: 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 () {
        console.log('mod2');
    }
    return obj;
}(mod1));


mod1.whichMod();

当我调用mod1.whichMod()方法时,它表示mod2未定义。为什么是这样?

我希望mod1.whichMod()调用mod2.whichMod(),但mod2应该在mod1之后“定义”,如上所示。

1 个答案:

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