JS执行堆栈的实际V8实现

问题描述

我很好奇。 JavaScript引擎在内部究竟如何实现EMCAScript执行堆栈指令。

如果您看下面的代码,ECMAScript将期望我们创建一个带有环境记录的全局执行上下文,该环境记录将包含fun1,res和c变量。 调用fun1时,我们将创建一个新的函数执行上下文,该上下文将包含一个环境记录,其中将包含a和b变量以及关联的值。

在V8团队Blazingly fast parsing,part 2: lazy parsing的这篇博客文章中,很明显,在内部,除非变量受闭包影响,否则它们将使用内存堆栈来控制函数调用。

我很好奇下面代码中的res和c变量是否也将放在堆栈中吗? 实际上会为简单的代码(如示例中的代码)创建全局和函数执行上下文的环境记录。

完全理解任何答案,在这种情况下,就使用JS而言,答案最终无关紧要。

let fun1 = function(a){
let b = 2;
return a+b;
}
let res = fun1(4);
let c = ”done";

解决方法

(这里是V8开发人员。)

精确度

确切的细节很复杂。如果您真的很在意这些,请阅读源。

是内部实现的JavaScript引擎

每个引擎的答案将有所不同。随着时间的流逝,它也会改变。即使放大一个引擎的一个版本,答案也可能是“取决于”。

我很好奇下面代码中的resc变量是否也将放在堆栈中吗?

全局变量是全局对象的属性。在存储为全局对象属性之前,这些变量的值可能会或可能不会短暂存储在堆栈中。

实际上将为示例中的简单代码创建全局和函数执行上下文的环境记录。

是-一种或另一种方式。具有全局对象并在其上存储属性是具有全局上下文的“环境记录”的一种方法。

此抽象是关键的见解。不要期望有EnvironmentalRecord类或类似的东西。这是一个抽象的概念,描述了引擎必须具有 some 方式来存储函数变量的概念。这可能是堆栈帧中的插槽,也可能是“上下文”对象,或者(在优化的编译器中)某个寄存器的某个“有效范围”,或者是许多其他内部实现选择。还值得注意的是,在编译时的范围解析与在运行时的实际值存储之间是有区别的:对于前者,引擎可能必须保留更多的元数据,并使用与后者不同的内部实现。>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...