Jun*_*Gor 13 javascript heap stack closures
如下代码:
var foo = function() {
var a = 1; // closure var
return function() { // closure fun
console.log(a);
}
};
var bar = foo();
Run Code Online (Sandbox Code Playgroud)
当foo退出(或者说,返回)时,我们知道变量a不会被破坏并保留在内存中(这就是闭包工作的原因).所以我的问题是变量是存储,堆栈还是堆?
sle*_*man 23
闭包只是堆栈概念的演变.
堆栈用于在调用函数时分离/隔离范围.当函数返回时,堆栈帧(激活记录)从调用堆栈中弹出,从而释放已使用的内存,允许下一个函数调用将该RAM重用于其堆栈帧.
闭包的作用是,而不是实际释放该堆栈帧,如果该堆栈帧中有任何对象/变量被其他任何东西引用,那么它将保留该堆栈帧以供将来使用.
大多数语言通过将堆栈实现为链表或散列表而不是扁平数组来实现此目的.这样,堆栈可以在运行时重新排序,并且不受物理内存布局的约束.
所以.考虑到这一点,答案是闭包中的变量存储在堆栈和堆中.根据您的观点.
从语言的角度来看,它绝对是堆栈.因为这就是理论上的闭包 - 一个改进的堆栈.
从机器语言或底层C /汇编代码的角度来看,链表列表的概念是无稽之谈.因此,更高级别的语言必须使用堆来实现其"堆栈".
所以变量在堆栈中,但该堆栈可能位于堆中.
这当然取决于您的编程语言的实现.但是上面的描述对于大多数javascript解释器(当然是我见过的所有解释器)都是有效的.