【问题标题】:In javascript, If functions are 1st class objects. Then where the varibles which closes over this function gets stored in heaps or stack?在 javascript 中,如果函数是第一类对象。那么关闭这个函数的变量存储在堆还是堆栈中?
【发布时间】:2020-04-08 08:31:08
【问题描述】:

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

作为用户,您通常不需要担心。

【问题讨论】:

标签: javascript v8


【解决方案1】:

(这里是 V8 开发人员。)您是对的,一个函数中的局部变量被另一个函数关闭,不能轻易地存储在堆栈中。具体来说,在 V8 中,它们存储在堆上的所谓“上下文”对象中,这就是 @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;
  }
}

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 2019-09-08
      • 2017-10-06
      • 2016-12-27
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2015-05-03
      相关资源
      最近更新 更多