2012-03-20 125 views
2

我試圖在JS中使用模塊模式。但是當我在控制檯中呼叫HM.init()時,它表示undefined。這就像this.carousel根本不存在。這是爲什麼?在javascript中擴展模塊模式中的模塊

JS:

(function(window, $){ 

    var HM = (function (HM) { 

     HM.init = function(){ 
      this.carousel.init(); 
     } 

     return HM; 

    })(HM || {}); 

    window.HM = HM; 

    $(function(){ 
     console.log(HM.init()); // this doesn't work 
    }); 


})(window, jQuery); 

//Extending module (this is supposed to be in another file) 
(function(window, HM, $){ 
    HM.carousel = { 
     init: function(){ 
      return 'initialise HM'; 
     } 
    } 
})(window, HM, jQuery);. 

非常感謝

回答

4

它打印undefined是因爲HM.init不返回任何原因(不return語句,所以它默認爲返回undefined)。

要麼要在呼叫前加returnthis.carousel.init(),像這樣:

... 
HM.init = function(){ 
    return this.carousel.init(); 
} 
... 

...或者你想使用console.log,而不是內部的HM.carousel.init功能,如果你想打印「初始化HM」控制檯:

... 
HM.carousel = { 
    init: function(){ 
     return 'initialise HM'; 
    } 
} 
... 

(本身的返回值是不是一個很好的調試工具,因此它可能更有意義與console.log打印)

+0

感謝Jonas的回覆。我更新了代碼,但它仍然無效。檢查代碼。 – Shaoz 2012-03-20 16:18:01

+0

正確;問題是'HM.init'不會返回任何東西。 '在HM.init'內部返回this.carousel.init()'應該起作用,至少它對我有用。用'console.log'代替我的意思是你可以把'return'初始化HM'改成例如'console.log('初始化HM')'(假設它只是調試輸出,而你實際上並不想返回它)。對不起:P – FireFly 2012-03-20 16:21:25

+0

再次感謝,但在這個項目中,這個代碼是所有其他模塊初始化的核心,所以每個模塊的返回都有點麻煩。例如,一個旋轉木馬模塊將被創建,以及一個標籤,手風琴等......因此,爲他們每個人做回報都很奇怪,除非我當然無能爲力。 – Shaoz 2012-03-20 16:31:03