クロージャーが外部関数で返され、そのクロージャーがその外部関数で定義されたいくつかの変数を参照する場合、外部関数は return ステートメントの後にリサイクルされますか?
また、クロージャーは引き続き変数にアクセスできるため、システムはこれらの変数をどこに保存しますか?
ありがとう!
クロージャーが外部関数で返され、そのクロージャーがその外部関数で定義されたいくつかの変数を参照する場合、外部関数は return ステートメントの後にリサイクルされますか?
また、クロージャーは引き続き変数にアクセスできるため、システムはこれらの変数をどこに保存しますか?
ありがとう!
各クロージャーは最終的に新しいクラス/関数を作成し、クロージャーによって参照される各変数はそのフィールド/プロパティの1つになるため、いいえ、ガベージコレクションは行われません。クロージャーのクラス/関数のインスタンスがガベージコレクションされます参照がありません
最初にあなたの質問を理解できませんでした。今、回答を更新しています。
説明:- 関数内に関数をネストできます。ネストされた (内部) 関数は、それを含む (外部) 関数に対してプライベートです。また、クロージャーを形成します。
クロージャは、自由変数をそれらの変数をバインドする (式を「閉じる」) 環境と一緒に持つことができる式 (通常は関数) です。
ネストされた関数はクロージャーであるため、ネストされた関数はそれを含む関数の引数と変数を「継承」できることを意味します。つまり、内側の関数には外側の関数のスコープが含まれます。
要約する:
内側の関数は、外側の関数のステートメントからのみアクセスできます。
内部関数はクロージャーを形成します。内部関数は外部関数の引数と変数を使用できますが、外部関数は内部関数の引数と変数を使用できません。
次の例は、ネストされた関数を示しています。
function addSquares(a,b) {
function square(x) {
return x * x;
}
return square(a) + square(b);
}
a = addSquares(2,3); // returns 13
b = addSquares(3,4); // returns 25
c = addSquares(4,5); // returns 41
内部関数はクロージャーを形成するため、外部関数を呼び出して、外部関数と内部関数の両方に引数を指定できます。
function outside(x) {
function inside(y) {
return x + y;
}
return inside;
}
fn_inside = outside(3);
result = fn_inside(5); // returns 8
result1 = outside(3)(5); // returns 8
変数の保存
inside が返されたときに x がどのように保持されるかに注目してください。クロージャーは、参照するすべてのスコープで引数と変数を保持する必要があります。呼び出しごとに異なる引数が提供される可能性があるため、外部への呼び出しごとに新しいクロージャーが作成されます。メモリは、返された内部にアクセスできなくなった場合にのみ解放できます。
これは、他のオブジェクトに参照を格納することと変わりませんが、参照を直接設定せず、それらを調べることができないため、あまり明白ではありません。
グローバル変数が設定されると、window オブジェクトに追加されます!
var myValue;
function setValue()
{
myValue = "test";
}
function getValue()
{
alert(window.myValue); // yup, it's "test"
}