JavaScriptは勉強ノートを閉じます.

2197 ワード

@(JSテクニック)[クローズド]
JavaScriptは勉強ノートを閉じます.
閉包とは何ですか
  • には、関数呼び出しが完了した後、コンテキスト環境の実行が継続的に破壊されない場合があります.クローズドの中身を理解する必要があります.
  • クローズドの鍵は、戻り値が関数であり、関数内部パラメータが親のスコープに関係していることである.
  • クローズドとは、他の関数の内部変数を読み取ることができる関数である.Javascript言語では、関数内部のサブ関数だけが局所変数を読み取ることができるので、クローズドを単に「関数の内部に定義された関数」と理解することができる.
  • いわゆる「クローズド」とは、ターゲットオブジェクトのための別の関数として構造関数の体内で定義される方法関数であり、このオブジェクトの方法関数は、逆に外層外層関数における一時変数を参照する.これにより、オブジェクトが生存期間内にその方法を維持することができれば、元の構造関数がその時に使用した臨時変数値を間接的に維持することができる.最初のコンストラクタコールは終了し、一時変数の名前も消えましたが、対象オブジェクトの方法では常に変数の値を参照することができます.この値はこの方法でしかアクセスできません.同じコンストラクタを再度呼び出しても、新しいオブジェクトと方法だけが生成されます.新しい一時変数は新しい値に対応するだけで、前回の呼び出しはそれぞれ独立しています.
  • クローズドの実現形?
  • 関数は、戻り値として機能する.
  • function fu(){
        var max = 10;
        return function bar(x){
            if (x>max) {
                console.log(x);
            }
        }
    }
    
    var f1 = fn();
    f1(15);
    
  • 関数をパラメータとして伝える.
  •  var max = 10,
            fn = function(x){
                if (x>max) {
                    console.log(x);
                }
            };
        (function(f){
            var max = 100;
            f(15);
        })(fn);
    
    クローズド発生のメカニズム
    関数は独立した作用領域を生成することができます.JSでは関数は一等公民です.パラメータ伝達として利用できます.実行時には関数を呼び出す必要がありますので、コンテキスト環境を呼び出す必要があります.したがって、コンテキスト環境は保存されます.メモリにはより多くのコンテキスト環境が保存されています.これもそのオーバーヘッドの大きな原因です.
    クローズドの発生は、関数の実行環境、活動対象、スコープ、スコープチェーンと密接に分けられません.
    クローズドの用途
    クローズドは多くのところで使えます.その最大の用途は二つあります.
  • は、前に述べた関数内部の変数を読み取ることができる
  • です.
  • もう一つは、これらの変数の値を常にメモリに保持させ、メモリ内で一つの変数を維持することです.前の例のように、関数a中iはメモリに存在しているので、c()を実行するたびに、iに1を加算します.
  • 保護関数内の変数の安全性.
  • JSプライベート属性およびプライベート方法(外部からアクセスできない)を保護変数の安全により実現する
  • .
    クローズド使用の注意事項
  • は、クローズドされると関数の変数がメモリに保存され、メモリの消費が大きいので、クローズドを乱用することはできません.そうでないと、ウェブページの性能問題が発生し、IEでメモリのリークを引き起こす可能性があります.解決方法は、関数を終了する前に使用しないローカル変数をすべて削除します.
  • クローズドは親関数の外部にあり、親関数の内部変数の値を変更します.したがって、親関数を対象として使用する場合は、クローズドをそのパブリックメソッドとして、内部変数をそのプライベート属性として扱い、親関数内部変数の値を勝手に変えないように注意してください.
  • Javascriptのゴミ回収メカニズム
    Javascriptでは、オブジェクトがもう引用されないと、このオブジェクトはGCによって回収されます.2つのオブジェクトが相互に参照され、第三者から引用されなくなると、この2つの相互参照の対象も回収されます.関数aはbによって引用され、bはa以外のcによって引用されるので、これは関数aが実行されても回収されない理由です.
    参考文献
    javascriptプロトタイプとクローズド(15)——クローズド学習Javascriptクローズド(Cloure)を深く理解する.