3

如果在外部函数中返回了闭包,并且该闭包引用了在该外部函数中定义的一些变量,那么外部函数是否会在 return 语句之后被回收?

并且由于闭包仍然可以访问变量,系统将这些变量存储在哪里?

谢谢!

4

2 回答 2

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。闭包必须在它引用的所有范围内保留参数和变量。由于每次调用都可能提供不同的参数,因此每次调用外部都会创建一个新的闭包。只有当返回的内部不再可访问时,才能释放内存。

这与将引用存储在其他对象中没有什么不同,但通常不太明显,因为不直接设置引用并且无法检查它们。


当一个全局变量被设置时,它被添加到窗口对象中!

var myValue;
function setValue()
{
myValue = "test";
}

function getValue()
{
alert(window.myValue); // yup, it's "test"
}
于 2013-09-08T06:01:34.363 回答