闭包中的变量存储在哪里 - 堆栈还是堆?

时间:2015-03-24 05:48:32

标签: javascript stack closures heap

与以下代码类似:

var foo = function() {
    var a = 1; // closure var
    return function() { // closure fun
        console.log(a);
    }
};
var bar = foo();

当foo退出(或说,返回)时,我们知道变量a不会被销毁并保留在内存中(这就是闭包工作的原因)。所以我的问题是变量是存储,堆栈还是堆?

1 个答案:

答案 0 :(得分:21)

闭包只是堆栈概念的演变。

在调用函数时,堆栈用于分隔/隔离范围。当函数返回时,堆栈帧(激活记录)从调用堆栈中弹出,从而释放已使用的内存,允许下一个函数调用将该RAM重用于其堆栈帧。

闭包的作用是,不是实际释放该堆栈帧,如果该堆栈帧中的任何对象/变量被其他任何东西引用,那么它将保留该堆栈帧以供将来使用。

大多数语言通过将堆栈实现为链表或散列表而不是扁平数组来实现此目的。这样,堆栈可以在运行时重新排序,并且不受物理内存布局的限制。

因此。考虑到这一点,答案是闭包中的变量存储在堆栈和堆中。视您的观点而定。

从语言的角度来看,它肯定是堆栈。因为那是理论上的闭包 - 一个修改过的堆栈。

从机器语言或底层C /汇编代码的角度来看,链表列表的概念是无稽之谈。因此,更高级别的语言必须使用堆来实现其" stack"。

因此变量位于堆栈中,但该堆栈可能位于堆中。

这当然取决于您的编程语言的实现。但是上面的描述对大多数javascript解释器都是有效的(当然是我所见过的所有解释器)。