公式説明
「クロージャ」は、多くの変数を持ち、それらの変数をバインドする環境式 (通常は関数) であるため、これらの変数も環境式の一部です。
一般的な説明
JavaScript の関数はすべてクロージャです。しかし、一般的に言えば、入れ子関数によって生成されたクロージャはより強力であり、ほとんどの場合、これを「クロージャ」と呼びます。次のコードを見てください。
< script type="text/ javascript">
このスクリプトで var c=a() を実行すると、変数 c は実際に関数 b を指します。変数 i は b で使用されます。c() を実行すると、ウィンドウがポップアップして i の値が表示されます。このコードは実際にはクロージャです。なぜでしょうか。なぜなら、関数aの外にある変数cは、関数a内の関数bを参照しているからです。
JavaScript のガベージ コレクション機構
JavaScript の特殊なガベージ コレクション機構により、クロージャーが生成されます。 JavaScript のガベージ コレクション メカニズムの一般的な規則は次のとおりです。
JavaScript では、オブジェクトが参照されなくなった場合、そのオブジェクトは GC によってリサイクルされます。 2 つのオブジェクトが相互に参照し、サードパーティによって参照されなくなった場合、相互に参照している 2 つのオブジェクトもリサイクルされます。上記のスクリプトでは、関数 a が b によって参照され、関数 b が関数 a の外側の c によって参照されるため、関数 a は実行後にリサイクルされません。
クロージャの適用シナリオ
1. 関数内の変数を保護します。上記の例を例にとると、関数 a の変数 i には関数 b からのみアクセスでき、他の手段ではアクセスできないため、i のセキュリティは保護されます。
2. 変数をメモリ内に保持します。上記の例と同様に、クロージャにより、関数 a の i は常にメモリ内に存在するため、c() が実行されるたびに、i は 1 ずつインクリメントされます。
3. 変数のセキュリティを保護して JS プライベート プロパティとプライベート メソッドを実装します (外部からアクセスできません)。次のように、プライベート プロパティとプライベート メソッドはコンストラクターの外部ではアクセスできません:
function Constructor(…){
var that = this;
var membername = value;
function membername(…){…}
}