卑近な話の閉包に対する理解


クローズド・パケットを理解するには、まず変数のスコープを理解しなければならない.Javascriptには、2つの作用領域がある.関数内部ではグローバル変数を直接読み込むことができます.
var n = 999
function f1 () {
  console.log(n)
}
f1() // 999
上のコードでは、関数f1は、グローバル変数nを読み出すことができる.
しかし、関数外では関数内部の生命の変数は読み込めません.
function f1() {
  var n = 999
}
console.log(n) // Uncaught ReferenceError: n is not defined
様々な原因のために、関数内の局所変数を得る必要があります.正常な状況では不可能です.それは関数の内部で関数を定義しています.
function f1() {
  var n = 999
  function f2() {
    console.log(n) // 999
  }
}
上のコードでは、関数f2は関数f1の内部にあり、これはf1内部の局所変数対f2であるが、逆にf2の内部の局所変数対f1は可視ではない.これはJavascript言語特有の「連鎖作用領域」構造である.サブオブジェクトは、親オブジェクトの変数を1段階ずつ上に探します.したがって、福のオブジェクトのすべての変数は、サブオブジェクトに対して可視であり、逆に成立しません.f2f1の局所変数を読み出すことができる以上、f2を戻り値としている限り、f1の外部から彼の内部変数を読み取ることができるのではないでしょうか?
function f1() {
  var n = 999
  function f2() {
    console.log(n)
  }
  return f2
}
var result = f1()
result() // 999
上記のコードでは、関数f1の戻り値が関数f2であり、f2f1の内部変数を読み出すことができるので、外部からf1の内部変数を取得することができる.
クローズドとは、関数f2、すなわち、他の関数の内部変数を読み取ることができる関数である.
クローズドの最大の用途は2つあります.
一つは関数内部の変数を読み取ることができます.二つはこれらの変数を常にメモリに保存させることです.すなわち、閉じたパックは彼の誕生環境を常に存在させることができます.
カプセル化オブジェクトのプライベート属性とプライベート方法.