2010-06-27 54 views
4

我有一個關於javascript中的自我調用函數的問題。javascript新的自我調用函數

我在做什麼是類似於以下

myNamespace = {}; //namespace for holding any objects/functions 

//helpModule as an example 

myNamespace.HelpModule = new (function(){ 
    this.abc = '123'; 
    //lots of other code in here... 
})(); 

東西現在我能夠訪問myNamespace.HelpModule的性質,像這樣:

alert(myNamespace.HelpModule.abc); 

但對於初學者的JSLint沒有按」 t喜歡說「奇怪的構造,刪除'新'。」, 而這page指出,你不應該使用函數構造函數,雖然在這種情況下,我不知道它是否使用函數構造函數,因爲它的自調用函數?

無論如何,它似乎工作正常,我使用它的原因是有「這個」範圍的功能,而不是全局對象(窗口)。我可以將其定義爲對象文本或做類似的事情,以

myNamespace.HelpModule = (function(){ 
    var obj = {}; 
    obj.abc = '123'; 

    return obj; 
}(); 

但是這些都似乎是「優雅」給我。

我想知道這是不好的形式/實踐?

+0

定義模塊的冷靜的方式,從未見過! – 2012-10-11 16:20:43

回答

5

這很奇怪,因爲定義構造函數的目的是能夠重用它來創建許多對象。

你的目的,你可以使用這個construct-

myNamespace.HelpModule = (function(){ 
    //private stuff here 
    var a = 100; 
    return { 
     //public stuff here 
     b : 200, 
     something: function() { 
      return a + this.b; 
     } 
    }; 
})(); 
+0

嗯,這有點類似於我的第二個代碼示例,但更優雅。但我與對象文字有關的問題是,例如使用jQuery我想要使用$ .bind將某些事件綁定到對象,我必須等到對象被定義後,並且在您的情況下必須執行$( myNamespace.HelpModule).bind('myEvent',function(){etc ..});在自我調用功能之後。所以它不是一個很好的自我包含的代碼片段 – Okeydoke 2010-06-28 20:59:32