我见过really cool explanation of closure.所以在我的视图中,闭包是一种在某处存储数据的方法。让我们看一下封闭的例子和没有封闭的例子:
没有关闭:
function F1(x,y)
{
var z=5;
function F2(){
console.log('x='+x+'y='+y+'z='+z);
}
F2();
}
F1(1,2)
关闭:
function F1(x,y)
{
var z=5;
function F2(){
console.log('x='+x+'y='+y+'z='+z);
}
return F2();
}
var p=F1(1,2)
p();
我已经理解,当F1()完成其工作时,在关闭时,F1()会清除与保存F1值的商店的连接。但F2()仍保留对值存储的引用。
让我们看一下图片:
我想知道记忆中会发生什么。我对C#知之甚少,并且引用类型是为每个引用类型在堆中创建对象的原因。 我的问题是,如果F1()的值已经被垃圾收集,如何存储F2()的值?
我的意思是在内存中发生了什么 - 创建了多少对象?(JavaScript在堆上创建对象,如C#?)或者JavaScript只是使用堆栈来存储函数值?
答案 0 :(得分:3)
每次调用函数时,都会创建一个新的activation context containing the local variables。如果内部函数使用任何这些变量,则保存激活上下文(在闭包中),以便可以在该函数之外访问局部变量。
每个激活上下文(函数调用)只创建一个闭包。也就是说,
<unavailable>
垃圾收集器永远不会垃圾收集仍然引用它的闭包。另外,这是内存泄漏的原因之一。在闭包和DOM元素之间经常存在循环引用,这使得IE无法收集该闭包,因为它无法检测到DOM元素和常规JavaScript对象之间的循环引用。