クローズド

1902 ワード

背景
JSのスコープは関数単位で、子は親スコープの変数にアクセスできますが、親はサブスコープの変数にアクセスできません.Javascript言語特有の「連鎖作用領域」構造は、サブオブジェクトが1段階ずつ上に向かってすべての親オブジェクトの変数を探します.したがって、親オブジェクトのすべての変数は、子オブジェクトに対しては見えますが、逆は成立しません.
  function f1(){
    var n=999;
  }
  alert(n); // error
外部から内部変数を読み込むにはどうすればいいですか?
関数の内部に関数f 2を作成し、f 2を返します.
function f1() {
  var n = 999;

  function f2() {
    console.log(n);
  }

  return f2;
}

let result = f1();
result(); // 999 
上記のように、f2関数はクローズドです.クローズドとは、他の関数の内部変数を読み取る関数であり、関数の内部に定義されている関数であることを理解することができます.クローズドは関数内部作用領域と関数外部を連結する橋です.
閉包の役割
  • 関数内部の変数
  • を読みだします.
  • は、これらの変数を常にメモリに保持させる
  • .
    function f1() {
      var n = 999;
      nAdd = function () {
        n += 1
      }
      function f2() {
        console.log(n);
      }
      return f2;
    }
    var result = f1();
    result(); // 999
    nAdd();
    result(); // 1000
    
    resultは実際にはクローズドf 2関数であり、2回の運転値が違っています.関数f 1の局所変数nはメモリに保存されていますが、f 1呼び出し後は自動的に消去されません.f 1はf 2の親関数であり、f 2はグローバル変数を与えられ、f 2は常にメモリにあり、f 2の存在はf 1に依存しているため、f 1も常にメモリにあり、呼び出しが終了した後、ゴミ回収メカニズムによって回収されることはない.nAdd=function(){n+=1}はvarキーワードがないので、nAddは大域変数であり、その値は匿名関数であり、この匿名関数自体はクローズドであるので、関数内部の局所変数を再関数外部で動作させることができる.
    http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.
    クローズドの特徴
  • クローズドされた外殻層は、関数の内部に定義された関数である
  • .
  • クローズド内部には関数
  • があります.
  • クローズドは、内部関数(閉じられた目地が外部から内部変数にアクセスするため)を返します.
  • クローズドバックした関数の内部にreturn thisがありません.これはthisが変更されたからです.
  • .
    var name = "The Window";
      var object = {
        name : "My Object",
        getNameFunc : function(){
          var that = this;
          return function(){
            return that.name;
          };
        }
      };
      alert(object.getNameFunc()());
    
  • がクローズドを実行すると、クローズド内部変数が存在し、クローズド内部関数の内部変数が存在しません.
  • クローズドの使用シーン
  • 関数参照方式を採用したsetTimeout呼び出し
  • 関数をオブジェクトに関連付ける例示的な方法
  • .
  • パッケージ関連の機能セット
  • クローズドが不正に使用されると、無効なメモリが発生します.