2012-03-20 91 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