关于JavaScript编译阶段
据我所知,JavaScript代码经历了两个阶段:编译阶段和执行阶段,当像V8这样的JavaScript引擎运行我们的代码时。 我想知道堆内存实际上是什么时候分配给函数的。 更具体地说,如果在代码中声明函数而不调用它,JavaScript引擎(如V8)是否仍在编译阶段为函数分配内存关于JavaScript编译阶段,javascript,v8,Javascript,V8,据我所知,JavaScript代码经历了两个阶段:编译阶段和执行阶段,当像V8这样的JavaScript引擎运行我们的代码时。 我想知道堆内存实际上是什么时候分配给函数的。 更具体地说,如果在代码中声明函数而不调用它,JavaScript引擎(如V8)是否仍在编译阶段为函数分配内存 谢谢这比两个阶段要复杂一些。引擎通常会尽量节省内存,但没有什么是完全免费的。可以安全地假设,从未调用过的函数比被调用的函数消耗的内存少,但不是零 特别是在V8中,(大多数)代码首先是“预解析的”。preparser留
谢谢这比两个阶段要复杂一些。引擎通常会尽量节省内存,但没有什么是完全免费的。可以安全地假设,从未调用过的函数比被调用的函数消耗的内存少,但不是零 特别是在V8中,(大多数)代码首先是“预解析的”。preparser留下了一些关于它所看到的函数的元数据;主要是他们在源代码中的起始/结束位置,以及他们需要从外部上下文中获取哪些变量(如果有的话)的一些信息 当程序执行达到某个点时,JavaScript可以使用某个函数(作为变量),就会为它创建一个实际的对象。此函数对象尚未包含代码或字节码 调用函数时,它会及时编译为字节码。从这一点开始,字节码将消耗内存 如果V8注意到函数花费了大量时间,它可能会决定为其生成优化代码。除了字节码之外,还存储优化代码,因此函数的内存消耗再次增加。有些函数从未达到这一点(例如,当它们只被调用几次时)
当然,当执行一个函数时,它可以创建其他对象。(这可能不是你要问的,只是为了完整起见才提一下。)你能详细说明在V8中编译的哪些步骤,JS文件的初始读取在哪个阶段完成,堆内存分配在哪个阶段完成吗?这一切都在解析器中吗?还是预解析器?解析器和preparser都读取JS文件。堆内存分配没有单点:preparser为元数据分配一些内存;函数对象本身在其周围范围被执行时被分配;它的字节码是在第一次执行时生成(并分配)的,它的优化代码是在以后进行优化时生成的。