其中是闭包中存储的变量-堆栈或堆

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

本文关键字:堆栈 变量 闭包 存储      更新时间:2023-09-26

类似以下代码:

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

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

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

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

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

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

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

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

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

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

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