3

パブリック アクセス用とプライベート アクセス用の 2 つのメソッド名を覚える必要がないようにしたいと思います。その意味で、両方に同じ名前を使用すると、スクリプトが失敗するのはどのような場合ですか? 次のコードはいつ失敗しますか?

var TestClass = function() {
    function showMessage(text) {
        $("div").text(text);
    }
    return {
        showMessage: showMessage
    };
}();

この fiddleで試してみましたが、FF、IE、Chrome、Safari で適切に動作します。JSLint もそれについて何も言うことはありません。

プライベート メソッド_showMessageshowMessageFn. これには正当な理由がありますか?

私が探している答えは、状況によっては失敗するか、混乱を招く可能性があるか、または規則を発明する JavaScript の人々がスマートに見えるだけであるということです。

4

2 に答える 2

3

これは問題なく動作します。内部関数のコンテキストで呼び出される関数を定義し、それをエクスポートされたオブジェクト リテラルshowMessage()のプロパティに割り当てます。showMessage

プロパティ名は任意の有効な識別子にすることができるためshowMessage、もちろん完全に有効です。あなたの例では、関数定義を参照して、内部スコープでfunction showMessage(text)呼び出される識別子を作成します。次に、オブジェクト リテラルのプロパティ名として呼び出されるの識別子showMessageを作成します。これには、内部識別子によって参照される関数の値が割り当てられます。両方の識別子が同じ名前を持っているという事実は、それらが同じスコープに存在しないため関係ありません。showMessage

私が見ることができる唯一の問題は、関数呼び出しを括弧で囲む必要があることです。そうしないと、関数が自己呼び出しであることが読者にすぐにはわかりません。

したがって、この:

var TestClass = function() {
    ...
}();

これになります:

var TestClass = (function() {
    ...
}());

プライベート メソッドの前にアンダースコアが付けられることが多い理由は、単純に広く使用されている規則です。これは、メソッドがプライベートであることを意図していることを示しています (Javascript はアクセス修飾子をサポートしていないため、クロージャーにカプセル化されていないプロパティまたはメソッドは、外側のスコープからアクセスできません)。この StackOverflowの質問に対する受け入れられた回答は、それを完全に要約しています。

于 2012-08-03T09:56:51.057 に答える
0

ここで行っているのは、定義した関数のオブジェクトを含むオブジェクトを返すことです。

基本的には、作成されたのと同じスコープで関数にアクセスしているか、別のスコープで関数にアクセスしているかを示す方法だと思います。

于 2012-08-02T14:58:57.253 に答える