0
var foo = (function() {
    var proxy = {},
        warning = false;

    proxy.warn = function(msg) {
        if (!warning) {
            warning = true;
            alert(msg);
        }
        return this; //For the purpose of method chaining we return proxy object.
    }

    function func() {
        alert(warning); //This is a private function relative to foo.
    }

    return proxy;
}());

foo.warn(); //will alert
foo.warn(); //will not alert since warning has been set to true

警告の値を保持している新しいキーワードが使用されていないため、ここでインスタンス化について混乱していますか?警告が存在するスコープに関して、ここにリークはありますか?

ありがとうございました。

4

4 に答える 4

2

aトップクロージャー機能によく住んでいますfunction() {...

fooは、返されるプロキシオブジェクトを保持しています。これは、このプロキシオブジェクトに含まれていないものはすべてプライベートであり、fooからアクセスできないことを意味します。の値を取得したい場合はa、a=>を返す新しい関数を追加できます。

proxy.getValueOfA=function(){return a}

その後、あなたは呼び出すことができますfoo.getValueOfA()

備考として:

var proxy={}

の短縮形なvar proxy=new Object()ので、インスタンス化があります。

于 2009-12-18T00:28:41.033 に答える
1

両方ともproxy.methodclosureプロパティを介しfuncてアクセスできます。スコープとオブジェクトの詳細については、最近公開された次の記事を確認してください: JavaScriptオブジェクト、変数、関数、およびプロトタイプの簡潔で実行可能なガイドa

投稿したコードは「モジュールパターン」と呼ばれるものに適合し、プライベート変数とメソッドを簡単に作成できるため、JavaScriptでオブジェクトを定義する非常に一般的な方法になりつつあります(前述のクロージャプロパティを利用することにより) 。

于 2009-12-18T00:49:00.957 に答える
1

別の質問に対するこの回答は、JavaScriptオブジェクトがどのように機能するかについての理解を深めるのに本当に役立ちました。

JavaScript関数のエイリアシングが機能していないようです

コードスニペットについては、分解してみましょう。高レベルの構造を確認することから始めます var foo = ( exrpession );。簡単に言うこともできますがvar foo = expression;、IE固有の癖を処理するには、IIRCの括弧が必要です。

さて、この場合、は無名関数です。Javascriptは、名前のない関数を定義するのに最適です。参照をどこかに保存しない限り、それを呼び出すことを期待しないでください。次のように、宣言の直後に匿名関数を呼び出すこともできます。

function() {
     alert('test');
     return 42;
}();

これは、コードスニペットのに使用される基本構造と疑わしいほど似ているはずです。うまくいけば42、私のサンプルからのが同じように簡単にオブジェクトになる可能性があることが簡単にわかります。

それで、疑問が残ります、なぜあなたはこれをするのですか?javascriptでは、関数もオブジェクトであることを忘れないでください。OOPの優れた学生として、オブジェクトの一部のメンバーを非公開にすることをお勧めします。ただし、javascriptにはこれをサポートするものが組み込まれていません。幸い、その内部関数からオブジェクトを返すと、その関数で定義されている他の変数にアクセスできますが、外部コードにはそれらにアクセスする方法がありません。つまり、実際には、プライベートメンバーでオブジェクトを作成しました。

于 2009-12-18T00:28:37.260 に答える
1

これ

    return proxy;
}());

これである必要があります

    return proxy;
})();

この

function() {
     alert('test');
     return 42;
}();

動作しません...構文エラー。ここに配置する前に、コードを試してください。あなたがこれを意味したことはかなり確かです:

(function() {
     alert('test');
     return 42;
})();

また、プライベートメンバーを返すという事実は、スコープの閉鎖のすべてのポイントを打ち負かしますが、それは機能します...

var foo = (function() {
    var proxy = {}, // private
    proxy.warn = function(msg) {
    ...
    return proxy; // publicly accessible

それはと同じです

var foo = { warn: function(){ /* code */ } };
于 2009-12-18T01:14:37.273 に答える