2014-09-12 67 views
0

我試圖實現模塊化模式:使用模塊模式,爲什麼引用是未定義的?

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

MOD2還不存在。這是設置的方式,如果你移動上面的mod2,將面臨同樣的問題,因爲mod1不會存在。 – Tony 2014-09-12 17:35:30

+0

但是在最後一行:mod1.whichMod()中,創建了mod1和mod2。當我將mod2傳遞給mod1時,是不是通過引用? – firebird 2014-09-12 17:37:34

+0

奇怪的是,如果我用「this」替換「obj」(例如:this.WhichMod = function(){}),它就可以工作。 – firebird 2014-09-12 17:41:57

回答

1

問題是你正在使用立即執行的閉包。這是採用新的'obj'並放置'undefined'mod2並將其填充到whichMod函數中。當您稍後調用該函數時,它無法更新其未定義的引用。 'this'起作用的原因是因爲你正在返回可以訪問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 
}); 
相關問題