封闭中的值会发生什么? JavaScript的

时间:2016-01-25 19:10:08

标签: javascript closures

我见过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()仍保留对值存储的引用。

让我们看一下图片:

没有关闭: enter image description here

关闭: enter image description here

我想知道记忆中会发生什么。我对C#知之甚少,并且引用类型是为每个引用类型在堆中创建对象的原因。 我的问题是,如果F1()的值已经被垃圾收集,如何存储F2()的值?

我的意思是在内存中发生了什么 - 创建了多少对象?(JavaScript在堆上创建对象,如C#?)或者JavaScript只是使用堆栈来存储函数值?

1 个答案:

答案 0 :(得分:3)

每次调用函数时,都会创建一个新的activation context containing the local variables。如果内部函数使用任何这些变量,则保存激活上下文(在闭包中),以便可以在该函数之外访问局部变量。

每个激活上下文(函数调用)只创建一个闭包。也就是说,

<unavailable>

垃圾收集器永远不会垃圾收集仍然引用它的闭包。另外,这是内存泄漏的原因之一。在闭包和DOM元素之间经常存在循环引用,这使得IE无法收集该闭包,因为它无法检测到DOM元素和常规JavaScript对象之间的循环引用。