JS閉包知識点整理


JSは閉じます.これは専門用語ですが、分かりやすい説明で関数の中の関数です.これはかなりややこしい概念なので、どこから整理したらいいのか分かりません.本当に無口です.やはり順を追って漸進的にしましょう!
関数のスコープ
スコープは関数の変数アクセス権限を決定しました.
 function test() {
      var a = 4;
 }
 test();
 alert(a);
 //  :a is undefined a     
これはドメイン問題を簡単に定義し,関数の外部はtest()法以外の関数で関数内部の局所変数にアクセスできない.プログラムを少し修正してください.
function test() {
      a = 4;//  a       
 }
 test();
 alert(a);
 //  :4
これはaがグローバル変数になるため、プログラムのどこにでもアクセスできます.実行の流れを簡単に理解してください.基本:GC(ゴミ回収器)は現在の対象がない時に引用されます.GCは現在の対象を回収します.1>test関数を呼び出し、メモリは関数の変数とコード割り当て空間、a=4として実行されます.2>testが実行された後、aを含む参照されなくなります.だからGCに回収されます.3>alert関数はaを参照します.関数内部変数aは既に回収されていますので、メモリにa方向の参照アドレスは存在しません.エラーが発生します.a is undefinedを提示します.
デフォルトの作成:
 function test() {
            a = 4;
            function inner() {
                a++;
            }
            return inner;
        }
        var inn =test();
        inn();
        alert(a);
上記の関数testにはもう一つの関数があります.この関数は内部関数といいます.彼は内部変数として見ることができます.この関数はtest関数の変数aにアクセスできます.1>関数testを作成し、メモリは空間を割り当てます.inner関数と変数aを含む.2>関数testは、aと関数innerのために空間を割り当てて、声明の順序に従います.aを4に初期化し、innerは空間のみを割り当て、実行されなかった.3>関数innerをグローバル変数に返しました.4>この時は関数inner以外に関数testのaの値にアクセスして修正する方法はありません.5>実行関数innは、実際にはinner関数であり、aを+1とする.6>実行が完了したら、GCはグローバル変数innまたはinner関数を回収します.(innはここで参照されています.)閉じられたパケットをより専門的な方法で説明しますか?それとも元のコードですか?閉じられたパケット:多くの変数と結合されたこれらの変数を持つ環境の表現です.(通常は関数です.)したがって、これらの変数もこの式の一部です.初めて勉強したら分かるのは変です.本当に言葉がないです.上記の過程を通じて、クローズドは実際には大きなパッケージであることを知っているはずですが、小さいカバンは自分の参照を大域変数innに割り当てることによって、大きなバッグの中のaの値を変えることができます.このパッケージは、多くの変数(つまり、testとinnerの一連の変数)がクローズドされているという大域変数の参照を提供しており、この参照によってこれらの変数にアクセスできます.
(PS:e…これは個人的な見解です.後で修正しないようにします.)コード実行フローのメモリ分析(進級分析は簡単です.):なぜ私達はtest実行後にaを訪問することができますか?GC回収testではなく、innの関数を作成してtestのすべての変化量を含みます.これは不合理で、明らかにこれはシステムのオーバーヘッドを増加させます.関数testでは実行されていないinn()はGCによって回収されていません.メモリに保存し続けます.
標準解釈:
ネットでいろいろ探しましたが、整理して、クローズドについて説明します.まずいくつかの概念を紹介します.(これらの概念は気持ちが悪いと認めています.理解したらとても役に立つと思います.例えば、もう一度関数の内部に関数があると言ったら、クローズドとも言えます.これはコミュニケーション効率を節約しますが、同時にコミュニケーションの難易度を高めます.)スコープチェーン:大域変数または大域関数のスコープはwindowオブジェクトで、スコープは父の関係で、彼の前段のオブジェクトを通じてこのオブジェクトにアクセスします.実行環境:これはtestに対して作用領域の設定と後置の活動対象の設定です.これはjs解釈器であり、作用ドメインチェーンを実行環境と解釈し、活性化すると理解できる.活動対象:活動対象も属性を持つ対象ですが、プロトタイプがなく、JavaScriptコードを通じて直接アクセスできません.testアクティビティオブジェクトはtest作用分域チェーンの最上位に位置する.アクティブオブジェクトの設定:関数のいくつかのイメージを含め、呼び出し時のパラメータ値を保存します.これらはアクティブオブジェクトのargments属性に保存されます.
実行フロー(クローズド)
  • は関数testを実行し、メモリはそれらのために空間を割り当てる.
  • 分配空間における詳細:1>jsインタプリタtest作用ドメインチェーンは、実行環境2>初期化testにおける変数の作用領域3>と解釈し、testアクティブオブジェクトを作成して、test実行値を保存するために、アクティブオブジェクトをtestアクティブ領域の先端に保存する.4>内蔵関数innerは、上記3つのフローを実行します.
  • は、保存関数innerを参照することによって、test関数の変数がGCによって回収されておらず、a値にアクセスできた
  • です.
  • ポップアップウィンドウ:5