如果在外部函数中返回一个闭包,并且该闭包引用了该外部函数中定义的一些变量,那么外部函数是否会在return语句之后被回收?
由于闭包仍然可以访问变量,系统在哪里存储这些变量?
谢谢!
答案 0 :(得分:1)
每个闭包最终都会创建新的类/函数 并且闭包引用的每个变量都是其字段/属性之一 所以,不,不会被垃圾收集 当闭包的类/函数的实例没有引用时,它会被垃圾收集
答案 1 :(得分:-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
保留变量
注意返回内部时x是如何保留的。闭包必须保留它引用的所有作用域中的参数和变量。由于每个调用都提供了可能不同的参数,因此每次调用外部都会创建一个新的闭包。只有当返回的内部不再可访问时,才能释放内存。
这与在其他对象中存储引用没有什么不同,但通常不太明显,因为没有直接设置引用而无法检查引用。
设置全局变量时,它会被添加到窗口对象中!
var myValue;
function setValue()
{
myValue = "test";
}
function getValue()
{
alert(window.myValue); // yup, it's "test"
}