2012-07-16 11 views
8

私はSO(特にこれはHow do JavaScript closures work?)のすべての他の(優秀な)回答を見てきましたが、私はそのコンセプトについてのあなたのご意見を募集しました。これはjavascriptクロージャの有効な使用例ですか?

私は、プライベートメソッドの実装をパブリックアクセスから隠すことを念頭に置いていることを理解しています。

私は工場出荷時の発電機としてそれを持っているのだと思う他の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 

は、だから、(閉鎖のための有効な使用事例だと思いますつまり作成同じコードベースを使用する複数のファクトリ)?それとももっと良いものを使って同じことを達成できますか?

この問題は、クロージャの技術的な実装と、アプリケーションの設計/開発における有効なユースケースについての詳細な情報ではありません。

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

+0

私によく見えます。 – Almo

+0

いいね!私はそれに何も間違いはないと思う。 – Linuxios

+3

技術的には、 'm'は必要ありません。' make'を直接使うことができます。 – josh3736

答えて

3

はい、変数を非公開にすることは、クロージャの有効な使用です。それはあなたが変数を公的なメンバーにすることなく、変数にプライベートアクセスすることを可能にします。

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

0

クロージャは便利な用途の多くの非常に強力な構築物です。あなたが使ったものは、実際には「ハック」のようなものです。クロージャの最も一般的な使い方は、途中で「何か」を行う機能を実装したときです...そして、「何か」は、あなたが望むものを多かれ少なかれ設定することができます...例えば、jQueryのajaxの機能リクエストにエラーがあったときや、成功したときなど、何かをすることができます。 クロージャがない場合は、「静的に定義された」関数を渡すことしかできません。グローバル変数から何をしたいのかを決めるために必要なコンテキストを集めるか、function(customData){}のようなCやC++のようなすべての関数に同じシグネチャを使わなければならないでしょう... クロージャは実行時に「動的に関数を構築する」ことができます。作成されたときのコンテキストに基づいて、何かを「何か」する必要のあるモジュールに渡すことができます。あなたはcまたはC++で行うことも、closuなしで行うこともできますそれは醜い、エラーが起こりやすく、ハックだということです)。

あなたが何か内部のいくつかのカスタム機能を「設定」しなければならない時はいつでもそれで、あなたはクロージャを使用します...

1

私が正しくあなたの質問を理解していた場合、あなたはmakeプロパティプライベートを保つことに関係していません?その場合は、その後、閉鎖は本当に必要ではない、とあなたはプロトタイプを使用して同じ機能を実現でき... this questionごとに、パフォーマンス上のメリット(減少メモリと増加速度)を関連付けられた

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

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

+1

モデル名は保存されますが、プライベートにはなりません。メンバ変数は誰でも利用できます。OPの閉鎖の利点は、モデル名が本当にプライベートであることです。 – jfriend00

+0

ええ、少し具体的に私の答えを編集しました。 'make'をプライベートにする必要がない場合は、これは実行可能な答えです。しかし、そうであれば、クロージャーが最善の解決策です。 – market

+1

私は、OPの質問の閉鎖の全体的なポイントはプライバシーだと思った。私は、プライバシーが必要ないならば、閉鎖は必要以上に複雑になり(おそらくメモリ消費が悪化する)ことに同意します。パブリックの場合、メンバ変数は最も簡単です。 – jfriend00

関連する問題