閉鎖、閉鎖とは何か、閉鎖の問題と分析
閉鎖
クロージャーについて説明する前に、まず機能を理解しましょう
-
関数定義段階
i。メモリ内のストレージスペースを開きます
ii。このスペース内でまったく同じ文字列として関数本体にコードを配置し
ます1.検出されたすべての変数が解析されません
iii。このスペースアドレスをに割り当てます関数名(変数名) -
関数呼び出しフェーズ
i。関数名(変数名)に従って対応するストレージスペースを見つけます
ii。関数実行スペースを再度開きます
iii。
この実行スペースで正式なパラメーター割り当てを実行しますiv。この実行スペースで事前分析します
v。関数ストレージスペースを格納しますコードを実行スペースにコピーして
viを実行します。実行が完了すると、開いている実行スペースは破棄されます。 -
関数呼び出し
i。各関数呼び出しは実行スペースを開きます
ii。一度呼び出すと実行スペースが開きます
iii。コードが破棄されます
iv。再度呼び出すと実行スペースが再度開かれます
v。コードは実行後に破棄されます
どのような状況で関数の実行スペースが破壊されないかについて話しましょう
-
破壊されない関数実行スペース
i。関数が実行されると、実行スペースが開かれます
ii。すべてのコードがこの実行スペースで実行されます
iii。実行が完了すると、関数実行スペースが破棄されます -
特別な場合
i。関数の実行スペースは破棄されません -
特別な状況は何ですか
i。関数が「複雑なデータタイプ」を返す場合
ii。「複雑なデータタイプ」を受け取る関数の外部に変数があります
iii。この時点では、関数の実行スペースは破棄されません -
破棄されない関数実行スペース
i。いつ破棄されるか
ii。外部から受信した変数
が関数の戻り値を参照しなくなった場合iii。関数実行スペースが破棄される
閉鎖
-
クロージャの生成には3つの必要条件があります(1つは必須です)
1。関数Bが
関数A内で直接または間接的に返されます2.関数プライベート変数(プライベートデータ)が関数B内で使用されます3.
関数A外の変数この機能Bを受け取り、
破壊されない機能空間を形成します。 -
閉鎖空間
1.破壊されないA関数の実行空間を閉鎖空間と呼びます
。2。関数Aで返された関数Bを関数Aの閉鎖関数と呼びます。3
。最後の文の公式定義:クロージャー==>関数内の関数 -
クロージャーの特徴(長所と短所は平行)
1。変数のライフサイクルを延長します。
長所:実行スペースが破壊されないため、変数が破壊されません。
短所:実行スペースが破壊されないため、常にメモリ内に存在します
。プライベート変数の
利点:クロージャー関数を使用して、関数内のプライベート変数にアクセスします。
デメリット:実行スペースは破棄されず、常にメモリ内に存在し
ます。3。プライベート変数を保護します(関数にこの機能がある場合)
利点:プライベート変数が存在しないように保護します。外部アクセス
デメリット:アクセスしたい場合は、クロージャー機能を使用する必要があります -
クロージャ機能の欠点は「致命的」
です。1。メモリスペースに破壊されないものがある
と、常にメモリ使用量が発生するため、多すぎるとメモリオーバーフローが発生します。3
。結果はメモリになります。道を譲る -
クロージャーを使用する場合
1.変数のライフサイクルを延長する必要がある場合
2.または特定の関数内のプライベート変数にアクセスする必要がある場合
閉鎖トピック
function fn(i){
return function(n){
console.log(n + (--i))
}
}
var f = fn(2)
f(3)
fn(4)(5)
fn(6)(7)
f(8)
分析:ここでは、描画方法に従って分析します。これは、より直感的で理解しやすいものです。
function fn(i){
return function(n){
console.log(n + (i++))
}
}
var f = fn(10)
f(20)
fn(20)(40)
fn(30)(50)
f(30)