封闭中的变量存储在哪里
像下面的代码一样:
var foo = function() {
var a = 1; // closure var
return function() { // closure fun
console.log(a);
}
};
var bar = foo();
当foo退出(或者说退货)时,我们知道变量a不会被销毁并保留在内存中(这就是闭包的原因)。 所以我的问题是变量是商店,堆栈还是堆?
封闭只是堆栈概念的演变。
当调用函数时,堆栈用于分隔/隔离范围。 当一个函数返回堆栈帧(激活记录)时,弹出调用堆栈,从而释放已使用的内存,允许下一次函数调用为其堆栈帧重用该RAM。
闭包的作用是不是实际释放堆栈帧,如果该堆栈帧中有任何其他引用的对象/变量,则它会保留该堆栈帧以供将来使用。
大多数语言通过将栈实现为链表或散列表而不是平面数组来实现这一点。 这样,堆栈可以在运行时重新排序,不受物理内存布局的限制。
所以。 考虑到这一点,答案是闭包中的变量存储在堆栈和堆中。 取决于你的观点。
从语言的角度来看,这绝对是堆栈。 因为这就是理论上的封闭 - 一个修改后的堆栈。
从机器语言或底层C /汇编代码的角度来看,链接列表堆栈的想法是无稽之谈。 因此,高级语言必须使用堆来实现其“堆栈”。
所以变量在堆栈中,但是堆栈可能位于堆中。
这当然取决于你的编程语言的实现。 但是上面的描述对于大多数javascript解释器(当然是我见过的所有的解释器)都是有效的。
链接地址: http://www.djcxy.com/p/14775.html