“解析JavaScript — lazy 是否比 eager更好?”

本文探讨了JavaScript解析的两种策略——lazy和eager,重点关注V8引擎的实现。lazy-parsing可以减少不需要立即执行的代码的解析时间,但可能导致额外的解析开销。箭头函数的解析问题和benchmarking的挑战也在文中被讨论。开发者可以通过理解这些机制来优化代码性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“解析JavaScript — lazy 是否比 eager更好?”

本文理论内容来自JSConf EU 2017 中“Parsing JavaScript — better lazy than
eager?”为题的主题演讲。

V8与解析器

  每个JavaScript代码在浏览器中被执行,经历的的第一步就是parser,解析器。
  解析器会将JavaScript源码生成AST和程序作用域(Scopes),后面就是字节码生成器生成字节码,然后编译生成机器码送入执行

  浏览器在解析真实网页的时候,经测试发现,在解析阶段,一般耗费的时间占总时间的15%-20%,这个时间已经是影响网络速度的重要因素之一。尤其在目前移动端兴起的情况,移动端浏览器会花费比桌面多大约36%时间来对JavaScript进行解析。
这里写图片描述

  根据google的Production Web Apps Performance Study研究得出结论,JavaScript的在解析速度大约 ~1MB/S。下面先来看看V8如何解析JavaScript。

  对于V8来说,目前有两种解析器,分为

  • parsers
  • PreParsers

  对于 parsers ,特点是full,“eager”。它会建立AST,创建完整的作用域,找出所有语法错误,用来解析那些将来会被complie的函数
  对于PreParsers, 特点是 fase“lazy”。 它 会跳过那些不想被编译的函数,不会创建ast。会创建作用域,但不会在里面包含变量引用或者声明。会比上面快两倍。只会找出那些部分严格的错误,所有代码可能不会完全遵守ECMA的规范。

  下面我们看看这两种解析器如何在解析 JavaScript代码时发挥作用。

let a =  0; //Top level code is eager
//IIFE
(function eager() {
  ...})() //Body is eager
//Top level function but not IIFE
function lazy() {
  ...} //Body is lazy
//Later
...lazy();
// -> eager parsed and complied now!;

  我们看到所有最外层代码都会使用eager-parsing,以及所有IIFE同样采用eager-parsing。而其他函数,采用lazy-parsing来解析函数体。当你在后面调用它的时候,这个函数会被eager-parsed和编译然后被执行。

  下面看看一些复杂的解析情况:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值