2013-07-22 41 views
7

比方說,我有命名空間,如何在同一個命名空間內從函數B調用函數A?

var Namespace = { 
    A : function() { 
     alert('Hello!'); 
    }, 
    B : function() { 
     // Call A() from here, do other stuff 
    } 
} 

在這個命名空間,我打算讓一個是一個輔助函數B.也就是說,A()將永遠不會空間外面叫。它只會被名稱空間內的函數調用。

解決名稱空間內本地/幫助函數問題的最佳方法是什麼?我看到它的方式有兩種可能性:

// Method #1  
var Namespace = { 
    A: function() { 
     alert('Method #1'); 
    }, 

    B : function() { 
     Namespace.A(); 
    } 
} 

Namespace.B(); 

// Method #2 
function Namespace2() { 
    var A = function() { 
     alert('Method #2'); 
    }; 

    this.B = function() { 
     A();   
    } 
} 

var ns2 = new Namespace2(); 
ns2.B(); 

在第一種方法,它是醜陋和awkard在命名空間內的每一個功能型Namespace.A()(反覆)。這使我更喜歡方法2。但我很好奇這裏的最佳做法。

回答

10

。一切都沒有明確公開將是自然的私人:

var Namespace = (function() { 
    var self = {}; 

    // Private 
    var A = function() { 
     ... 
    }; 

    // Public 
    self.B = function() { 
     A(); 
    } 

    return self; 
}()); 

Namespace.B(); // Works 
Namespace.A(); // Doesn't work 
+0

這是一個不錯的解決方案。我的問題是,命名空間是否在您每次訪問時都重新定義其功能?如果是這樣,這將是一個糟糕的內存使用。 – ktm5124

+0

@ ktm5124:否。函數立即運行,對象'self'分配給'Namespace'。 – Hubro

+0

@Codemonkey在你的情況下你不能創建多個'Namespace'對象。 – Neal

5

可以使用this聲明

this.A(); 
+6

這並不能保證調用'Namespace.A'。 – Hubro

+0

@Hubro如果我寫命名空間而不是命名空間,它適用於我。 – JedatKinports

1

調用它。如果你只打算使用AB,爲什麼不把它定義裏面B

var Namespace = { 
    B: function() { 
     var A = function() { 
      ... 
     } 

     A(); 
    } 
}; 

Namespace.B(); 
+2

我實際上打算在B,C,D,E ......中使用A,也就是說,所有的公共名稱空間函數都是很多的。 (我忽略了它們,只包含了B) – ktm5124

2

那麼你可以使用事件,其中在它自己的範圍創建的命名空間第三種選擇:我建議您將「命名空間」功能範圍內

var Namespace = (function(){ 
    var A = function() { 
     alert('scoped method'); 
    }; 

    function Namespace() { 

      var A1 = function() { 
       alert('Namespace "private" method'); 
      }; 

      Namespace.prototype.B1 = function(){ 
       A(); //will run 
       A1(); //will run with no errors 
      }; 

    }; 

    Namespace.prototype.B = function(){ 
     A(); //will run 
     A1(); //ERROR! 
    }; 

    return Namespace; 
})(); 
+0

感謝Neal,儘管我有同樣的問題,我在CodeMonkey的回覆中詢問過。也就是說,名稱空間是否每次訪問時都重新定義其功能? – ktm5124

+0

@ ktm5124在我的情況下,它沒有。你所要做的就是'new Namespace''其他的東西都已經定義好了。你可以在技術上做'Namspace .__ proto __。B();',它仍然可以在沒有'new'部分的情況下運行。 – Neal

-2
var Namespace = { 
    A : function() { 
     alert('Hello!'); 
    }, 
    B : function() { 
     Namespace.A(); 
    }, 
} 

注意分號末

+0

請問您可以添加有關您提供的解決方案的更多詳細信息? – abarisone

+0

逗號結尾? B的函數後面的逗號('},')與什麼有關? – cpburnz

+0

對不起,我的英語不好。我想說這是分號(,)。我注意到用於在snamepace <== GOOGLE STRANSLATE中回覆逗號(;)的分號。我仍然這樣編碼,它工作。 –

相關問題