3

クロージャーが外部関数で返され、そのクロージャーがその外部関数で定義されたいくつかの変数を参照する場合、外部関数は return ステートメントの後にリサイクルされますか?

また、クロージャーは引き続き変数にアクセスできるため、システムはこれらの変数をどこに保存しますか?

ありがとう!

4

2 に答える 2

1

各クロージャーは最終的に新しいクラス/関数を作成し、クロージャーによって参照される各変数はそのフィールド/プロパティの1つになるため、いいえ、ガベージコレクションは行われません。クロージャーのクラス/関数のインスタンスがガベージコレクションされます参照がありません

于 2013-09-08T06:02:46.057 に答える
-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"
}
于 2013-09-08T06:01:34.363 に答える