クロージャ感謝のjava

転送   https://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

まず、変数のスコープ

クロージャを理解するためには、JavaScriptが最初の特殊変数のスコープを理解する必要があります。

グローバルとローカル変数:変数のスコープは、2種類以上の何物でもありません。

特殊なので、JavaScript言語は、それが内部関数のグローバル変数を直接読み取ることができるということです。

  VAR N = 999。

  関数f1(){
    アラート(N)
  }

  F1(); // 999

一方、関数内のローカル変数の自然な関数の外で読み取ることができません。

  関数f1()は、{
    N = 999でした。
  }

  警告(N); //エラー

注意を払うの必要性は、あなたが関数内で変数を宣言する際に、VaRのコマンドを使用してください、があります。そうでない場合は、実際にグローバル変数を宣言します!

  関数f1(){
    N = 999。
  }

  F1();

  警告(N); // 999

第二には、どのように外部からローカル変数を読むには?

様々な理由から、私たちは時々、関数内のローカル変数を取得する必要があります。既に述べたようしかし、通常の状況下では、これは別の方法を介して達成することができ、行うことができません。

それがあることを、関数の内部、およびその関数を定義します。

  関数f1(){

    VAR N = 999。

    関数f2(){
      アラート(N)// 999
    }

  }

上記のコードでは、関数f2は、内部関数f1、f1の時間に含まれてF2の内部のすべてのローカル変数が表示されています。逆に、F2の内のローカル変数ではありません。しかし、F1は見えないようにです。これは、JavaScriptの言語固有の「スコープチェーン」構造(チェーン・スコープ)、親オブジェクトのすべての変数を見つけるまでサブ・オブジェクトです。だから、すべての変数の親オブジェクトは、子オブジェクトが表示され、その逆はありません。

F1、F2は、ローカル変数に読み込むことができますので、限り、戻り値としてF2として、我々はまだその内部変数外F1を読み取ることができません!

  関数f1(){

    VAR N = 999。

    関数f2(){
      アラート(N)
    }

    F2を返します。

  }

  結果= F1()でした。

  結果(); // 999

第三に、クロージャの概念

F2ファンクションのコードが閉鎖されます。

プロ文学の多様上の「閉鎖」(閉鎖)の定義は非常に、抽象的に理解することは困難です。私の理解では、クロージャが他の関数で読み取ることができる内部変数の関数であるということです

JavaScript言語、ローカル変数を読み込むための唯一の内部関数サブルーチンので、クロージャは、単に「関数内で定義された関数。」と解釈することができます

したがって、本質的に、クロージャは、内部ブリッジ機能と外部接続の機能です。

第四に、クロージャの使用

クロージャは多くの場所で使用することができます。これは、1つは、前述の変数が関数の内部で読み取ることができるであり、他方はこれらの変数の値が記憶に残るようにすることです、2のために最も有用です。

聖書を理解するには?次のコードを考えてみましょう。

  関数f1(){

    VAR N = 999。

    NADD =関数(){N + = 1}

    関数f2(){
      アラート(N)
    }

    F2を返します。

  }

  結果= F1()でした。

  結果(); // 999

  NADD();

  結果(); // 1000年

このコードでは、結果が実際に閉鎖関数f2です。それは第二の値が1000で、二回の合計、値が999である第一の時間を動作させます。これは、ローカル変数nの関数f1は、メモリに格納され、自動的にF1の呼び出し後に消去されていないことを証明しています。

なぜこのようにですか?その理由は、親関数f1は、通話終了後にF2で、f2はメモリ内に常にあるF2にリードグローバル変数に代入され、メモリにため、常にf1とf2、f1の存在に依存している、とではないということです、ガベージコレクション(ガベージコレクション)を回収しました。

第1フロントNADDのvarキーワードで使用されていないこのコード場所注目すべき別の、その「NADD =関数(){N + = 1}」行は、このようNADDは、グローバル変数ではなく、ローカル変数です。値は、匿名関数NADD(匿名関数)であり、そしてこの匿名関数自体は、それはセッターNADDに相当し、閉鎖され第二は、関数の外側に関数内のローカル変数に動作することができます。

第五に、閉鎖上の注意の使用

1)閉鎖に起因するそれ以外の場合は、メモリリークにつながる可能性がIEでのパフォーマンスの問題のWebページが発生します、それは虐待閉鎖することはできませんが、メモリの消費量が大きい場合には、変数の関数がメモリに格納されているようになります。ソリューションは、すべてのローカル変数が使用されていない削除する関数を終了する前に、あります。

2)クロージャは、親関数は、内部変数の値を変更し、親の外に機能します。あなたがオブジェクトとして使用する(オブジェクト)、そのパブリックメソッドのクロージャとして(パブリック・メソッド)、その私有財産(非公開の値)として内部変数を親関数を取るのであれば、あなたはしないように注意する必要がありますちょうど内部変数の親関数の値を変更します。

おすすめ

転載: www.cnblogs.com/mofei12138/p/12037624.html