在 javascript 中,如果函数是第一个 class 对象。那么关闭此函数的变量存储在堆或堆栈中的位置?

In javascript, If functions are 1st class objects. Then where the varibles which closes over this function gets stored in heaps or stack?

我引用了堆栈溢出的答案 -->> V8 使用类似于 JVM 和大多数其他语言的堆。然而,这意味着局部变量(作为一般规则)放在堆栈上,而对象放在堆中。例如,如果函数关闭这些值,这可能不成立。与在 JVM 中一样,如果原语存储在局部变量中,则它们只能存储在堆栈中。

作为用户,这不是您通常需要担心的事情。

如果您查看 v8 doc,您会发现函数确实具有 Local<Context> 属性。 Local 是垃圾收集器管理的值的包装器 class,所以是的,上下文驻留在堆上。

(这里是 V8 开发人员。)你是对的,一个函数中被另一个函数关闭的局部变量不能轻易地存储在堆栈中。具体来说,在 V8 中,它们存储在堆上所谓的 "Context" 对象中,这就是 @JonasWilms 所指的。举例说明:

function outer() {
  let a = 1;  // Will be on the stack
  let b = 2;  // Will be in the context on the heap
  return function inner() {
    return b;
  }
}

你也完全正确,这不是你需要担心的事情:-) 特别是,因为 "stack" 和 "heap" 确实是内部实现细节;它们恰好是引擎(对于许多语言)如何以良好的性能实现所需行为的最常见方式。

从概念上讲,我们在这里讨论变量的范围和生命周期:在示例中,aouter 完成时超出范围(=变得不可访问)运行,而 b 仍然可以通过 inner 访问,因此只要可以再次调用 inner 它就会一直存在。引擎如何实现这一点是一个内部细节,并且可能随时发生变化。例如,引擎可以决定通过始终将所有变量放在堆上来简化其实现,避免需要提前分析哪些变量将被关闭,哪些不会。重要的是可观察到的行为,而不是它是如何在幕后实现的。