如何快速地解析JavaScript延迟解析
译不必要的代码会产生实际的资源成本:
由于这些原因,所有主流浏览器都实现了延迟解析。以前的做法是为每个函数生成一个抽象语法树(AST),然后将其编译为字节码,而使用了延迟解析之后,解析器就可以“预解析”它遇到的函数,而不需要对这些函数进行完全解析。它通过切换到预解析器来实现这一点,而预解析器是解析器的一个副本,它只做最基本的工作,否则就会跳过该函数。预解析器验证它跳过的函数在语法上是否是有效的,并生成正确编译外部函数所需的所有信息。在后边调用预解析的函数时,将按需对其进行完全解析和编译。 变量分配 使预解析复杂化的主要问题是变量分配。
出于性能原因,函数激活是在机器堆栈上进行管理的。例如,如果函数g调用了参数为1和2的函数f:接收器(即f的this值,由于它是一个草率的函数调用,所以它是globalThis)推入堆栈,接着是被调用的函数f。然后再将参数1和2推入堆栈。此时函数f被调用。为了执行调用,我们首先将g的状态保存在堆栈上: 包括f的“返回指令指针”(rip;我们需要返回什么代码)以及“帧指针”(fp;返回时堆栈应该是什么样子的)。然后我们输入f,它为局部变量c分配空间,以及它可能需要的任何临时空间。这确保了当函数激活超出作用域时,函数使用的任何数据都会消失: 它只是从堆栈中弹出。 (编辑:通化站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |