web-dev-qa-db-ja.com

javascript閉鎖= c#プロパティ?

JavaScriptとC#の両方に精通している人のために:

JSクロージャーは、c#でのプライベートプロパティとパブリックプロパティについての考え方と同じですか?

クロージャーは、Parent関数の呼び出しが完了した場合でも、親関数の変数(プライベートフィールド)にアクセスできる内部関数(パブリックプロパティ)を参照します。

内部関数がない場合、親関数の実行が完了すると、親関数の変数のスコープが停止します。したがって、親関数の「プライベート」変数にアクセスする方法の1つは、親関数の「プライベート」変数へのアクセスを維持する「パブリック」内部関数を経由するようです。

これは、Javascriptのクロージャを理解しようとしているC#の人にとって正しいことでしょうか?

6
nanonerd

ここでさまざまなことを混同しています。おそらく、クロージャを使用して、この種のアクセス修飾子を持たない言語でパブリックフィールドとプライベートフィールドの概念をシミュレートする方法の例を見たことがあるからです。

ただし、 closures -「内部スコープ」でバインドされた関数-の概念はより一般的です。 Javascript、C#、その他の言語でも利用できます。その主な目的は、「プライベートまたはパブリックプロパティ」のようなものを提供することをしないです-これは、クロージャの可能なアプリケーションの1つにすぎません。ウィキペディアの記事には、「アプリケーション」というセクションがあり、このコンセプトのその他の可能な用途のリストが含まれています。

18
Doc Brown

C#にもクロージャーがあります。例:

class A {
 Func<int, int> CreateClosure() {
    int a = 17;
    return x => x + a;
 }
}

このメソッドはクロージャー(関数x => x + a)、ローカル変数aをキャプチャします。

クロージャは特にプロパティとは関係ありませんが、変数への制御されたアクセスを提供する方法としてクロージャを使用できます。実際、オブジェクトはクロージャーを使用してエミュレートできます。

9
JacquesB

ブログ作成者がクロージャーのプライバシーの側面を公表するのをやめてほしいと思います。それはそれらの弱い使用法であり、ほとんど言及する価値はありません。それらについて知っておく価値があるのはcommunicationアスペクトであり、通信したい情報を保持するためのデータ構造を明示的に作成する必要はありません。次のECMAScript 6の例を考えます。

function bestSellingBooks(threshold) {
  return bookList.filter(book => book.sales >= threshold);
}

ここでは、filter値を簡潔に伝えるために、クロージャーがthreshold関数の述語として使用されています。 thresholdを他のエンティティのプライベートな値とは考えていません。 wantthresholdを他のエンティティのプライベートな値として考えることはしません。それがまさにポイントです。

クロージャは最も強力であり、サポート構造を構築してそれを識別および維持する必要なしに値を伝達したい場合に最もよく使用されます。クロージャーを使用せずに上記のfilter述部を実装してみてください。そうすれば、それがどれほど厳密に回避されるかがわかります。最良のクロージャの例は、ほとんど気づかないものです。

3
Karl Bielefeldt

いいえ。C#と比較したい場合は、コンストラクターのパラメーターの方が似ています。

APIが引数なしでコールバックを提供する必要があるとしましょう。

OOでは、通常、必要なすべての情報をコンストラクタで提供してオブジェクトを構築します。これで、引数なしのメソッドを実装できます。

関数型プログラミングでは、これは通常、クロージャーを使用して行われ、関数は外部スコープの変数を使用できるため、引数なしの要件を実装できます。

2