js閉包の理解


Javascript言語特有の「連鎖作用領域」構造は、サブオブジェクトが1段階ずつ上に向かってすべての親オブジェクトの変数を探します.親オブジェクトのすべての変数は、子オブジェクトに対しても見えますが、逆は成立しません.
背景を適用します.1)関数内の局所変数を得る必要がある場合があります.それは関数の内部でもう一つの関数を定義します.2)変数の値を常にメモリに保持させます.
一、閉包の概念:
クローズドとは、他の関数の内部変数を読み取る機能です.Javascript言語では、関数内部のサブ関数だけが局所変数を読み取ることができるので、クローズドは単に「関数の内部に定義されている関数」と理解することができます.したがって、本質的には、クローズドとは、関数の内部と関数の外部をつなぐ橋のことである.
function w(){
    var c = "         ";
    var n = 1;
    function b() {
        console.log(c+'----  '+n+' ');
        n++;
    }
    return b;
}
var f1 = w()

f1()//         ----  1 
f1()//         ----  2 
公式パッケージの定義:「クローズド」とは、多くの変数とこれらの変数が結合された環境を持つ表現(通常は関数)を指します.したがって、これらの変数もこの式の一部です.
以上の例を組み合わせて、公式定義を分析します.1、環境の表現式(通常は関数です.)は関数bです.2、bは多くの変数を持っています.c、n…;3、bはこれらの変数を結合しています.bはnを結合しています.f 1によってbが実行される毎に、bの実行文脈nは消失しないで、重畳するごとに可能である.4、これらの変数もこの表現の一部です.c、nは確かにb関数の一部です.
クローズドという意味は、1)jsには二つの作用領域があります.大域作用領域、関数の局所作用領域です.2)ローカルスコープ内ではグローバルスコープにアクセスできますが、グローバルスコープ内ではローカルスコープにアクセスできません.
二、閉包の特徴:
1)親レベル関数の変数にアクセスできます.2)クローズド関数内のthisはwindowを指す;
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()());//The Window
3)親レベル関数のthisとargmentsに直接アクセスできません.クローズド関数は、内部関数であり、直接に親レベル関数のthisとargmentsにアクセスできません.父レベル関数内でthisとargmentsを変数に割り当て、父レベル関数変数にアクセスすることでアクセスできます.
//           this
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()());//The Window
//      this   that  ,  that       this
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(object.getNameFunc()());//My Object
4)クローズド関数で使用する変数はメモリに保存されます.クローズド関数によって生成されたコンテキスト環境に含まれる変数はメモリに保存されます.呼び出しが終了すると破壊されません.ブラウザを更新または閉じるだけで破壊されます.
三、判例:
難点閉鎖例:
function w(){
    var c = 8;
    console.log("w    ")
    function b() {
        console.log(c);
        c++;
    }
    return b;
}
console.log(w());
// b() {
//         console.log(c);
//         c++;
//     }
w()()//8             c
w()()//8
w()()//8
var d = w();//d   window, w   window 
d()//8       ,           c    
d()//9
d()//10
console.log(c) //undefined c     ,  c   window (       ) 
理由:dは国家dを創建した後に、工作員dは何度も命令を実行する過程で、そのためもとの国家dの変数に対して変化して重畳したのです.w()()実際に新しい国と新しい特務をどんどん作っています.
四、深探閉包:
jsプログラム全体は最大の関数であり、プログラムが実行されると、グローバルなコンテキストが発生します.プログラムが実行中である限り、このグローバルコンテキストはいつまでも消えません.
五、結語:
1、クローズドとは、別の関数のスコープにアクセスする変数の関数であり、クローズドを作成する最も一般的な方法は、関数内に別の関数を作成し、他の関数を通じてこの関数の局所変数にアクセスすることである.クローズドは、関数の変数がメモリに保存されるため、メモリの消耗が大きいので、クローズドを乱用することはできません.そうでないと、ウェブページの性能に問題があります.解決方法は、関数を終了する前に使用しないローカル変数をすべて削除します.
2、どのようにしてクローズドにするかを決める必要はありません.実際に書いた関数はすべてクローズドになります.たとえ大域関数であっても、関数の外部の大域変数にアクセスする時は、クローズドの表現です.
参考:著者のybdt 201アドレスhttps://blog.csdn.net/ybdt1201/article/details/53366613 作者のルアンホーンビオhttps://blog.csdn.net/qappleh/article/details/80320476