2013-07-22 16 views
7

は、のは、私が名前空間を持っているとしましょう。この名前空間で関数Aを同じ名前空間内の関数Bから呼び出す方法は?

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

Aが言うことであるB.へのヘルパー関数であるために、私は(A、予定の)名前空間の外に呼び出されることはありません。名前空間内の関数によってのみ呼び出されます。

名前空間内のローカル/ヘルパー機能の問題を解決する最良の方法は何ですか?私は二つの可能性がある、それを見る方法:第1の方法では

// 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(); 

は、名前空間内のすべての機能にNamespace.A()(繰り返し)を入力するために醜いとawkardです。これは方法2を好むようになる。しかし、私はここでベストプラクティスが何か不思議でした。あなたが唯一の理由ではないBの内側にそれを定義し、B内部Aを使用する場合

答えて

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

これは素晴らしい解決策です。私の質問は、あなたがそれにアクセスするたびにNamespaceはその機能を再定義しますか?もしそうなら、それは記憶の悪い使用であろう。 – ktm5124

+0

@ ktm5124:いいえ。関数はすぐに実行され、オブジェクト 'self'が' Namespace'に割り当てられます。 – Hubro

+0

@Codemonkeyの場合、複数の 'Namespace'オブジェクトを作ることはできません。 – Neal

5

あなたはthis声明

this.A(); 
+6

これは 'Namespace.A'を呼び出すことが保証されていません。 – Hubro

+0

@Hubro名前空間の代わりに名前空間を書くと、それは私のために働く。 – JedatKinports

1

を使用してそれを呼び出すことができますか?

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

     A(); 
    } 
}; 

Namespace.B(); 
+2

私は実際にA、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に尋ねたのと同じ質問があります。つまり、Namespaceはその機能にアクセスするたびにその機能を再定義しますか?私の場合は – 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のカンマ(;)に返信するセミコロンがあります。私はまだ同じようにコードし、それは働いています。 –

関連する問題