卑近な話の閉包に対する理解
4395 ワード
クローズド・パケットを理解するには、まず変数のスコープを理解しなければならない.Javascriptには、2つの作用領域がある.関数内部ではグローバル変数を直接読み込むことができます.
しかし、関数外では関数内部の生命の変数は読み込めません.
クローズドとは、関数
クローズドの最大の用途は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段階ずつ上に探します.したがって、福のオブジェクトのすべての変数は、サブオブジェクトに対して可視であり、逆に成立しません.f2
がf1
の局所変数を読み出すことができる以上、f2
を戻り値としている限り、f1
の外部から彼の内部変数を読み取ることができるのではないでしょうか?function f1() {
var n = 999
function f2() {
console.log(n)
}
return f2
}
var result = f1()
result() // 999
上記のコードでは、関数f1
の戻り値が関数f2
であり、f2
はf1
の内部変数を読み出すことができるので、外部からf1
の内部変数を取得することができる.クローズドとは、関数
f2
、すなわち、他の関数の内部変数を読み取ることができる関数である.クローズドの最大の用途は2つあります.
一つは関数内部の変数を読み取ることができます.二つはこれらの変数を常にメモリに保存させることです.すなわち、閉じたパックは彼の誕生環境を常に存在させることができます.
カプセル化オブジェクトのプライベート属性とプライベート方法.