JavaScript 闭包存放在堆还是栈上?

15

根据标准,JavaScript 将闭包存储在堆(heap)还是栈(stack)中?
是否存在专门存储闭包的第三个位置?


2
你可能想看一下这个非常好的文章来找到你的答案。 - Phoenix
1个回答

12

最终,这是运行时的一种实现细节。请参见Phoenix链接

至于具体的实现方案,在上下文被销毁后存储局部变量的情况下,基于栈的实现不再适用(因为它与基于栈的结构的定义相矛盾)。因此,在这种情况下,父上下文中的封闭数据将保存在动态内存分配中(即“堆”中),并使用垃圾收集器(GC)和引用计数。这些系统速度比基于栈的系统慢。然而,实现可以始终对其进行优化:在解析阶段检查函数中是否使用了自由变量,并根据此决定 - 将数据放置在堆栈中还是“堆”中。


Phoenix链接无法使用。您能提供一些相关信息吗?或者如果已经移动到其他位置,是否可以提供另一个有效的链接?@Phoenix - valerii15298
您仍然可以在此处阅读完整的文章:https://web.archive.org/web/20220228071504/https://dmitrysoshnikov.com/ecmascript/chapter-6-closures/ - aggsol
但是在闭包中使用的变量可能是父函数的局部变量,因此存储在堆栈上(如果不是原始类型,则没有引用堆),当父执行上下文从堆栈中弹出时,包含该局部变量的变量环境也从堆栈中移除,那么闭包函数是如何保留对它的引用呢?在移除父函数执行上下文之前,该局部变量是否被复制到堆中? - undefined
将副本放入堆中可能会有所帮助,或者已知在闭包中的变量将首先在堆上创建。这很可能是优化和“巧妙技巧”的一个好领域。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接