Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于JavaScript编译阶段_Javascript_V8 - Fatal编程技术网

关于JavaScript编译阶段

关于JavaScript编译阶段,javascript,v8,Javascript,V8,据我所知,JavaScript代码经历了两个阶段:编译阶段和执行阶段,当像V8这样的JavaScript引擎运行我们的代码时。 我想知道堆内存实际上是什么时候分配给函数的。 更具体地说,如果在代码中声明函数而不调用它,JavaScript引擎(如V8)是否仍在编译阶段为函数分配内存 谢谢这比两个阶段要复杂一些。引擎通常会尽量节省内存,但没有什么是完全免费的。可以安全地假设,从未调用过的函数比被调用的函数消耗的内存少,但不是零 特别是在V8中,(大多数)代码首先是“预解析的”。preparser留

据我所知,JavaScript代码经历了两个阶段:编译阶段和执行阶段,当像V8这样的JavaScript引擎运行我们的代码时。 我想知道堆内存实际上是什么时候分配给函数的。 更具体地说,如果在代码中声明函数而不调用它,JavaScript引擎(如V8)是否仍在编译阶段为函数分配内存


谢谢

这比两个阶段要复杂一些。引擎通常会尽量节省内存,但没有什么是完全免费的。可以安全地假设,从未调用过的函数比被调用的函数消耗的内存少,但不是零

特别是在V8中,(大多数)代码首先是“预解析的”。preparser留下了一些关于它所看到的函数的元数据;主要是他们在源代码中的起始/结束位置,以及他们需要从外部上下文中获取哪些变量(如果有的话)的一些信息

当程序执行达到某个点时,JavaScript可以使用某个函数(作为变量),就会为它创建一个实际的对象。此函数对象尚未包含代码或字节码

调用函数时,它会及时编译为字节码。从这一点开始,字节码将消耗内存

如果V8注意到函数花费了大量时间,它可能会决定为其生成优化代码。除了字节码之外,还存储优化代码,因此函数的内存消耗再次增加。有些函数从未达到这一点(例如,当它们只被调用几次时)


当然,当执行一个函数时,它可以创建其他对象。(这可能不是你要问的,只是为了完整起见才提一下。)

你能详细说明在V8中编译的哪些步骤,JS文件的初始读取在哪个阶段完成,堆内存分配在哪个阶段完成吗?这一切都在解析器中吗?还是预解析器?解析器和preparser都读取JS文件。堆内存分配没有单点:preparser为元数据分配一些内存;函数对象本身在其周围范围被执行时被分配;它的字节码是在第一次执行时生成(并分配)的,它的优化代码是在以后进行优化时生成的。