在javascript中,If函数是第一类对象.那么,这个函数上的变量在哪里被存储在堆或堆栈中



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

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

(此处为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;
}
}

你也绝对正确,这不是你需要担心的事情:-(特别是,因为"堆栈"one_answers"堆"实际上是内部实现细节;它们恰好是引擎(对于许多语言(以良好性能实现所需行为的最常见方式。

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

如果查看v8文档,您可以看到Functions确实具有Local<Context>属性。Local是由garbagge收集器管理的值的包装类,所以是的,Context驻留在堆上。

最新更新