为了提高性能,JavaScript 引擎有时仅在实际调用函数时才完全解析函数。
例如,来自Spidermonkey源代码:
Checking the syntax of a function is several times faster than doing a full parse/emit, and lazy parsing improves both performance and memory usage significantly when pages contain large amounts of code that never executes (which happens often).
解析器可以跳过哪些步骤,同时仍然能够验证语法?
在 Spidermonkey 中,一些节省似乎来自于不发出字节码,例如在完整解析之后。进行完整解析,例如V8还包括生成机器代码吗?
最佳答案
首先澄清一下:这两个步骤称为“预解析”和“完全解析”。 “惰性解析”描述的是先进行前者,需要时再进行后者的策略。
预解析速度更快的两大原因是:
- 它不会构建 AST(抽象语法树),而 AST 通常是解析器的输出
- 它不会对变量进行作用域解析。
解析器在准备代码生成时还完成了一些其他内部步骤,仅在检查错误时不需要这些步骤,但以上两个是要点。
(完整)解析和代码生成是单独的步骤。
关于javascript - 是什么使得预解析函数比完整解析更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41824243/