0

1.)以下のような静的関数を呼び出し、静的関数に渡されたデータに対して追加の操作を実行する必要がある場合。ネストされた内部関数を呼び出すとクロージャが作成されますか?MakeSomethingOkはPerson.PerformSomeTypeOfOperationにのみ関連するため、私が求めているのは、MakeSomethingOkなどの操作をグローバルスコープで使用できないようにすることです。

2.)共有の場合のように、他の静的関数コンストラクターから_persons []のようなコレクションオブジェクトにアクセスする方法はありますか?Persons._personsを実行する必要はありません

3.)関数が静的である場合、関数コンストラクターは引き続きコンストラクターと呼ばれますか?

    function Person() { };
    function Persons() { var _persons = []; };
    Person.PerformSomeTypeOfOperation = function (someThing) {

        if (someThing == 'turnsOutToBeOk') { return 'anyThing' }
        else {
            function MakeSomethingOk() { }

            //someThing is now being made Ok
        };
    };

以下の回答(1.)を更新してください。

    function Person() { };
    function Persons() { **protected static** _persons = []; };

    Person.Operation1 = function (person) {

    if(person.id == _persons[0].id){}//do something
    };

    Person.Operation2 = function (person) {

    if(person.height > 7){//do something, like call NBA
           _persons.push(person);
           }
    };

    Person.Operation3 = function (person) {

    if(person.isHungOver){//do something, like call AA
           _persons.slice(3,1);
           }
    };

そのため、公開せずに同じ静的フィールドにアクセスしようとしていますが、それでもリストオブジェクトを操作できます。

4

1 に答える 1

0

ローカル関数は完全に正常であり(別の関数内で定義された関数)、いくつかの理由で使用されます。まず、定義されている関数内で呼び出すことができるスコープを制限します。次に、親関数の引数とローカル変数にアクセスできます。

Person.PerformSomeTypeOfOperation = function (someThing) {

    function MakeSomethingOk() { /* code here */ }

    if (someThing == 'turnsOutToBeOk') { return 'anyThing' }
    else {
        MakeSomethinngOK();
    };
};

とにかくjavascriptインタープリターがそれらをその場所に「持ち上げる」ので、通常は親関数の最初にそれらを定義します。

2番目の質問に関しては、静的関数は静的データを持つことができます。したがって、Persons.list = []を設定すると、他の関数を含め、誰でもそのデータにPersons.listとしてアクセスできます。メンバー関数のみがアクセスできるプライベートデータが必要な場合は、ここのような別の構成を使用する必要があります。

3番目の質問は、ほとんど意味論的な質問です。通常、コンストラクターのポイントは、オブジェクトを作成/初期化することです。シングルトン(1つの静的オブジェクト)のみを使用する場合は、複数のオブジェクトに使用できるコンストラクターではなく、1回限りの初期化と考えますが、それは私の意見です-私は思いませんこのコンテキストでは、シングルトンオブジェクトと複数オブジェクトの作成/初期化を区別する正確な定義があります。

于 2012-04-04T19:30:36.730 に答える