JSクローズド——JS関数のクローズドに対する本人の理解をまとめます(面接のポイント)

2524 ワード

包みを閉じる
クローズドの概念:クローズドは関数と宣言されたこの関数の品詞環境からなる現象で、この現象はJSにはどこにもありません.
閉じた例:
function myFunc1() {
    var a=10;
    function myFunc2() {
        alert(a);   
    }
    return myFunc2;
}
これは私たちの日常で最も一般的なクローズド現象である.一つの関数は別の関数の内部で宣言し、外部関数によって返される.この例では、関数myFun 2と関数myFunnc 1との間に形成されたコンテキストが、ともにクローズドされている.
閉塞の役割:
  • は、関数内で他の関数内で宣言されている変数
  • にアクセスする.
    上記の例では、内関数myFunnc 2ではmyFunnc 1の変数aにアクセスできます.これは2つの並列宣言の関数ではできません.すなわち、関数の内部で他の関数が宣言した局所変数にアクセスすることができます.内部関数は外部関数で宣言されているので、内関数は外部関数の局所変数に相当します.外部で内関数を使いたい場合、二つのステップを経なければなりません.
  • 外部関数は少なくとも一回実行します.(すなわち、宣言変数aと定義内関数)
  • 内の関数は、外部からのアクセスを保証するために何らかの形で保存されなければならない.
  • 内部関数を保存します.最初の方法は内関数を外関数の内部に大域変数を割り当てます.
    var N;
    function myFunc1() {
        var a=10;
        function myFunc2() {
            console.log(a);   
        }
       N = myFunc2;
    }
    
    myFunc1();  //         
    N(); //  10
    
      の2番目の方法は内関数以外の関数を値に戻して保存します.
    function myFunc1() {
        var a=10;
        function myFunc2() {
            alert(a);   
        }
        return myFunc2;
    }
    var myFunc = myFunc1();  //           
    myFunc(); //  10
    
  • クローズドバックでプライベートをシミュレートする方法:
  • 典型的なオブジェクト指向プログラミング言語(Javaなど)では、プライベート方法をサポートしています.すなわち、この方法は、そのクラスの他の方法のみを定義することができます.JavaScriptにはプライベート方法という概念がありません.しかし、私たちはクローズド・シミュレーションを用いてプライベート・アプローチを実現することができ、以下の例を参照してください.
    var add = function(){
      var number = 0;
      function cnumber(a){
        number = number+a;
      }
      return {   //        
        increment:function(){
          cnumber(1);
        },
        decrement:function(){
          cnumber(-1);
      },
       getNumber:function(){
          console.log(number);
        },
      }
    }
    
    var mo =add();    //    ,       mo,number = 0;
    mo.increment();  //     ,number = 1;
    mo.increment();//number = 2;
    mo.increment();//number = 3;
    mo.decrement(); //     ,number = 2;
    mo.getNumber();   //  2
    
    mo = add();    //      add,   mo,  number ,    
    mo.getNumber();  //  0
    
    この例では、プラス、マイナス、リセット、出力機能をサポートする簡単なカウンタを実現しました.最初にadd関数(周辺関数)を定義しました.中のcnumber関数はadd関数の作成作用領域にあります.プライベート関数として返されるオブジェクトの中の方法は変数number値の修正を達成するために繰り返し呼び出します.最後にgetNumberメソッドを呼び出して変数addをポップアップします.この例では、クローズドではなく、クローズドバッグの強さを表します.このパターンはJSでもモジュールと呼ばれています.
    クローズドを使う時は注意してください.
  • 外部関数が呼び出された後、外部関数の機能領域の変数が内部関数によって参照され、JSゴミ回収メカニズムによって変数が回収できなくなります.したがって、プログラム中に閉込められたパケットを乱用すると、メモリが非常に消費され、メモリが漏れてしまう恐れがあります.外部関数が最後まで実行する時は、手動で変数を回収するべきです.具体的な方法は変数にnull値を与えます.
  • クローズドは親関数の外部にあり、親関数の内部変数の値を変更します.方法:親関数を対象として使用する場合は、クローズドをそのパブリックメソッドとして、内部変数をそのプライベート属性として扱います.この時は、親関数の内部変数の値を勝手に変えないように注意してください.これは気づかないようなミスを引き起こすかもしれません.