閉包する学習ノート

4276 ワード

  • クローズド:他の関数の内部変数を読み取ることができる関数です.メソッド:関数の内部にある関数を定義し、この内部関数を通じて入口として内部変数を取得します.
  • function eg3(){
        var n = 9;
        var f2 = function(){
            alert(n);
        };
        return f2;
    };
    
    eg3()();
    // 
    function eg3(){
        var n = 9;
        var f2 = function(){
            alert(n);
        };
        return f2();
    };
    
    eg3();
    原理:Javascript言語特有の「連鎖作用領域」構造は、サブオブジェクトが1段階ずつ上に向かってすべての親オブジェクトの変数を探します.したがって、親オブジェクトのすべての変数は、子オブジェクトに対しては見えますが、逆は成立しません.
  • は、他の用途をカプセル化し、いくつかの変数の値を常にメモリに保持させる.
  •   function f1(){
        var n=999;
        nAdd=function(){n+=1}
        function f2(){
          alert(n);
        }
        return f2;
      }
      var result=f1();
      result(); // 999
      nAdd();
      result(); // 1000
    f 1はf 2の親関数であり、f 2はグローバル変数を与えられ、f 2は常にメモリにあり、f 2の存在はf 1に依存しているため、f 1も常にメモリにあり、呼び出しが終了した後、ゴミ回収メカニズムによって回収されることはない.nAddが相当して一つのsetterがあります.
  • クローズドの注意点1)クローズドは、関数の変数がメモリに保存されるため、メモリの消費が大きいので、クローズドを乱用してはいけません.そうでないと、ウェブページの性能に問題があり、IEでメモリのリークを引き起こす可能性があります.解決方法は、関数を終了する前に使用しないローカル変数をすべて削除します.
  • 2)親関数の外部で、親関数の内部変数の値を変更します.したがって、親関数を対象として使用する場合は、クローズドをそのパブリックメソッドとして、内部変数をそのプライベート属性として扱います.このときは、親関数の内部変数の値を勝手に変えないように注意してください.
  • は、シーン1を使用するUIを初期化するために、すべての変数をグローバル変数に変える必要がなく、クローズドパケットを使用することができます.2)パッケージを実現し、get、setメソッド内変数を実現する.3)オブジェクトに向けたクラス構造の使用法を実現するためのシミュレーション:
  • function Person(){    
        var name = "default";       
    
        return {    
           getName : function(){    
               return name;    
           },    
           setName : function(newName){    
               name = newName;    
           }    
        }    
    };    
    
    
    var john = Person();    
    print(john.getName());    
    john.setName("john");    
    print(john.getName());    
    
    var jack = Person();    
    print(jack.getName());    
    jack.setName("jack");    
    print(jack.getName());    
    運転結果は以下の通りです.
    default john default jack
    4)キャッシュ:処理に時間がかかる関数オブジェクトがあるので、計算された値を記憶しておく必要があります.この関数を呼び出した場合、まずキャッシュで検索します.見つけられない場合は、計算してキャッシュを更新し、値を返します.見つけたら、直接に検索した値を返してもいいです.この点は、外部からの参照を解放しないので、関数内部の値を保持することができます.
    参考資料:http://www.jb51.net/article/57259.htm http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.