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

Where are variables in a closure stored - stack or heap?

喜欢以下代码:

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

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

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

调用函数时,堆栈用于 separate/isolate 作用域。当函数 returns 堆栈帧(激活记录)从调用堆栈弹出,从而释放已用内存,允许下一个函数调用重用该 RAM 作为其堆栈帧。

闭包的作用是,如果该堆栈帧中有任何 object/variable 被其他任何内容引用,那么它会保留该堆栈帧以供将来使用,而不是实际释放该堆栈帧。

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

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

从语言的角度来说,肯定是栈。因为这就是理论上的闭包 - 修改后的堆栈。

从机器语言或底层C/assembly代码的角度来看,链表堆栈的想法是无稽之谈。因此,高级语言必须使用堆来实现其 "stack".

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

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