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

Javascript 闭包中的变量存储在哪里?堆栈还是堆?,javascript,closures,heap-memory,stack-memory,Javascript,Closures,Heap Memory,Stack Memory,与以下代码类似: var foo = function() { var a = 1; // closure var return function() { // closure fun console.log(a); } }; var bar = foo(); 当foo退出(或者说返回)时,我们知道变量a不会被销毁并保留在内存中(这就是闭包工作的原因)。所以我的问题是变量a存储、堆栈或堆在哪里?闭包只是堆栈概念的演变 调用函数时,堆栈用于分离/隔离作用域

与以下代码类似:

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

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

闭包只是堆栈概念的演变

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

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

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

所以。记住这一点,答案是闭包中的变量存储在堆栈和堆中。取决于你的观点

从语言的角度来看,它肯定是堆栈。因为这就是闭包在理论上的含义——一个经过修改的堆栈

从机器语言或底层C/汇编代码的角度来看,链表堆栈的想法是毫无意义的。因此,高级语言必须使用堆来实现其“堆栈”

所以变量在堆栈中,但堆栈可能位于堆中


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

请参阅下面关于闭包机制在内存级别如何工作的描述:那么闭包是基于环境模型的,它是底层堆栈/堆模型的另一个抽象层?谢谢