9

私はSOに関する他のすべての(優れた)回答(特にこれ:JavaScriptクロージャはどのように機能するのですか?)を調べましたが、概念の理解についてフィードバックを求めました。

1つのユースケースは、プライベートメソッドの実装をパブリックアクセスから隠すことであることを理解しています。

私が考えるもう1つは、ファクトリージェネレーターとして使用することです。

<script>

function carFactory( make ) {

    var m = make;
    return { manufacture: function ( model ) 

        {console.log("A " + m + " " + model + " has been created");}

    }
}

toyotaFactory = carFactory("toyota");
hondaFactory = carFactory("honda");

toyotaFactory.manufacture("corolla");
toyotaFactory.manufacture("corolla");
hondaFactory.manufacture("civic");

</script>

これは以下を出力します:

A toyota corolla has been create
A toyota corolla has been created
A honda civic has been created 

それで、それはクロージャの有効なユースケースだと思いますか(つまり、同じコードベースを使用して複数のファクトリを作成する)?それとも、もっと良いものを使って同じことを達成できますか?

問題は、クロージャの技術的な実装ではなく、アプリケーションの設計/開発における有効なユースケースに関するものであることに注意してください。

ありがとう。

4

4 に答える 4

4

はい、変数をプライベートに保つことは、クロージャの有効な使用法です。これにより、変数をパブリックメンバーにすることなく、変数にプライベートアクセスできます。

他の例については、このリファレンスを参照してください:http ://www.crockford.com/javascript/private.html

于 2012-07-16T00:30:44.713 に答える
1

私があなたの質問を正しく理解しているなら、あなたはmake財産を非公開にすることに関心がありませんか?その場合、クロージャーは実際には必要ありません。プロトタイプを使用して同じ機能を実現できます...

function carFactory(model){
  this.m = make;
}

carFactory.prototype.manufacture = function(model){
  console.log('A ' + this.m + ' ' + model + ' has been created');
}

この質問のように、これにはパフォーマンス上の利点(メモリの削減と速度の向上)があります。

于 2012-07-16T00:39:15.970 に答える
0

クロージャーは非常に強力な構成であり、多くの便利な用途があります。そこで使用したのは、実際には一種の「ハック」です。クロージャの最も一般的な使用法は、途中で「何かをする」機能を実装した場合です...そして「何かをする」は多かれ少なかれ好きなように設定できます...たとえばjQueryajax機能リクエストにエラーがあった場合や成功した場合などに「何かを行う」ことができます。クロージャがない場合は、「静的に定義された」関数のみを渡すことができます。これはおそらく収集する必要があります。グローバル変数から実行したいことを実行するために必要なコンテキスト。または、CやC ++のような関数(customData){} ...のように、すべての関数に同じシグネチャを使用する必要があります。

したがって、何かの内部でいくつかのカスタム機能を「構成」する必要があるときはいつでも、クロージャーを使用します...

于 2012-07-16T00:38:01.180 に答える
0

私は情報隠蔽/カプセル化の実際的な例を考え出そうとしていました、そしてこれは私のこれまでの試みです

'use strict';

const bank = (accountHolderName, initialDeposit) => {
    let balance = initialDeposit;
    const add = (amount) => {
        balance += amount;
    }

    let subtract = (amount) => {
        balance -= amount
    }

    let printBalance = () => {
        console.log(accountHolderName, "has balance of", balance, "dollars");
    }

    return {
        credit: add,
        debit: subtract,
        balance: printBalance
    }
}

let amy = bank("Amy", 1000);
amy.balance();
amy.credit(100);
amy.balance();
amy.debit(10);
amy.balance();

let sam = bank("Sam", 50);
sam.balance();
sam.credit(50);
sam.balance();
sam.debit(100);
sam.balance();

実行すると、次の出力が得られます

Amy has balance of 1000 dollars
Amy has balance of 1100 dollars
Amy has balance of 1090 dollars
Sam has balance of 50 dollars
Sam has balance of 100 dollars
Sam has balance of 0 dollars

メリット?

  • balance変数に直接アクセスすることはできません 。
  • クロージャを使用すると、すべての呼び出し元が独自のデータを取得します。エイミーズはデータ balanceに干渉していませんSam's
  • 呼び出し元(、、AmyおよびSamその他)は、動作方法に関する内部の詳細を気にする代わりに、操作するための優れたAPIを備えていbankます。

私は何か他のものが欠けていますか?

于 2019-09-03T23:11:38.857 に答える