JavaScriptの中のクローズドをどうやって理解しますか?


JavaScriptのクローズドに対する理解
  • クライテリア
  • クローズド
  • について
  • .何ですか?
  • .長所と短所?
  • .どう使いますか?(アキュムレータとしての例)
  • 変数を導入するライフサイクル
  • です.そこで、私たちはクローズド
  • を使います.
  • 総括
  • 前言
    本稿は著者の学習段階におけるクローズドの理解であり、主にクローズドの基礎知識点と知識点の理解を紹介している.本文は組み版でQ—問題A—答えを約束します.
    クローズドについて
    1.何ですか
    「あなたが知らないJavaScript」の定義は以下の通りです.
    関数が覚えていて、ある語法のスコープにアクセスできると、クローズドが発生します.関数が現在の語法のスコープ外で実行されても.
    2.長所と短所
    長所
  • は、パッケージ化、属性の私有化を実現する.自分の関数のスコープ内で、内部メンバー変数を実現し、Functionインターフェースを提供します.
  • 保護作用領域は解放されず、メンバ変数はキャッシュされて記憶性がある.
  • モジュールが開発し、グローバル変数の汚染を防止します.
  • 欠点
  • が閉じていると、作用領域チェーンが解放されなくなり、メモリ漏れを引き起こします.
    3.どう使いますか?(アキュムレータの例)
    変数を導入するライフサイクル
    code-1:
    var x = 0;
    function fn1() {
         
        return ++x;
    }
    console.log(fn1());
    console.log(fn1());
    //  :
    //1
    //2
    
    code-2:
    function fn2() {
         
        var x = 0;
        return ++x;
    }
    console.log(fn2());
    console.log(fn2());
    //  :
    //1
    //1
    
    Q 1:なぜ出力の結果が違っていますか?A 1:JSはブラウザで実行されていることを知っています.ブラウザエンジンにゴミ回収器があります.fn 1()とfn 2()は、自分の「ミッション」をクリアした後、回収・釈放されました.code-1の変数xはグローバル変数です.キャッシュはまだ存在します.回収されません.しかし、code-2の変数xはfn 2()において局所変数として定義されていますので、xは一括して回収されます.code-2コードのfn 2()が繰り返し起動された場合、xは常に定義され、0に割り当てられ、キャッシュされていません.
    Q 2:code-1は積算を実現しましたが、なぜまだクローズドという概念を使用していますか?つまりcode-1には何か欠陥がありますか?A 2:一つのプロジェクトでは多くの変数名を使用する必要があることを知っています.code-1は変数を大域的に定義します.大域変数の汚染を引き起こしました.また変数xがあまり使われないとメモリに空きがあり、メモリ空間が無駄になります.
    そこで私たちはクローズドを使います.
    code-2.1:
    //          (function(){})()
    var add = (function () {
         
        var x = 0;
        function doAdd() {
         return x += 1;}
        return doAdd;
    })();
    console.log(add());
    console.log(add());
    console.log(add());
    //  :
    //1
    //2
    //3 
    
    このとき、変数xは匿名関数が存在するそのスコープにのみ作用し、グローバル変数に汚染されません.code-2.1が最初のconsolie.log(add();ごみの回収器はaddを回収して釈放することはできません.doAdd関数はすでに外部に保存されています.つまり、アキュムレータは匿名関数の作用領域によって保護され、add法によってしか修正できない.
    これはまた、クローズドの欠点を説明しています.あまりにも多くのクローズドを書くと、メモリが大量に使われ、メモリが漏れてしまいます.クローズドは手動メモリをリリースして、ADd=nullを参照させる必要があります.すぐできます
    締め括りをつける
  • ケースでjavaを学んだ友達は、閉包と「類」がとても似ていると思います.関数内部の変数->クラスのメンバー変数を定義し、関数内のメソッド->クラスのメンバーメソッドをオブジェクトのように定義し、パッケージを通して変数をプライベート化し、関数を提供してメンバー変数にアクセスします.
  • 最後に、クローズドが保護機構のように見えることを理解しました.クローズドは、内部関数を保護するために破壊されないスタック環境を形成し、外部からの干渉を受けない.