其中是闭包中存储的变量-堆栈或堆
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退出(或者说返回)时,我们知道变量a不会被破坏并保留在内存中(这就是闭包工作的原因)。所以我的问题是变量在哪里存储、堆栈或堆?
闭包只是堆栈概念的演变。
堆栈用于在调用函数时分离/隔离作用域。当函数返回时,堆栈帧(激活记录)从调用堆栈中弹出,从而释放使用过的内存,允许下一个函数调用将该RAM重新用于其堆栈帧。
闭包所做的是,如果堆栈帧中有任何对象/变量被其他对象引用,那么它将保留该堆栈帧以备将来使用,而不是真正释放该堆栈帧。
大多数语言通过将堆栈实现为链表或哈希表而不是平面数组来实现这一点。这样,堆栈可以在运行时重新排序,并且不受物理内存布局的约束。
所以。考虑到这一点,答案是闭包中的变量存储在堆栈和堆中。取决于你的观点。
从语言的角度来看,它绝对是堆栈。因为这就是闭包在理论上的意义——一个经过修改的堆栈。
从机器语言或底层C/汇编代码的角度来看,链表堆栈的想法是无稽之谈。因此,更高级别的语言必须使用堆来实现其"堆栈"。
因此,变量在堆栈中,但该堆栈可能位于堆中。
这当然取决于编程语言的实现。但上面的描述对大多数javascript解释器(当然是我见过的所有解释器)都有效。
相关文章:
- 将函数的上下文应用于javascript变量
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 将PHP变量传递给jQuery时遇到问题
- 如何通过ajax刷新JSF填充的javascript变量
- 参数变量出现ngTable指令问题
- 通过javascript重定向html传递php变量
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 全局变量和全局对象的属性之间有什么区别吗
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 值对象在某个变量发生更改后发生更改
- Javascript变量赋值|
- 使用MEAN堆栈-查询MongoDB并将值作为变量传递
- js函数堆栈传入变量,.hide()不起作用
- 其中是闭包中存储的变量-堆栈或堆
- 当一个变量被传递给一个函数时,JavaScript堆栈会发生什么
- 在node.js中,全局变量的值在堆栈被无限递归超越后神秘地重置
- 是否可以读取父堆栈帧的局部变量
- 设置环境变量 MEAN 堆栈 .zshrc 时遇到问题
- 遍历堆栈时 JavaScript 中的变量范围