Skip to content

⚠️ Important Notice

This post was last updated on: which was . Please pay attention to its timelines.

V8怎么处理的闭包

什么是闭包

简而言之,闭包就是当前函数能访问到父级中的变量。 在JS中,函数是一等公民,所以:

  • 可以在一个函数中声明另一个函数
  • 静态词法作用域,让函数可以沿着作用域链访问到父级的变量
  • 函数是一等公民,所以可以作为另一个函数的返回值。

以上三个特性,让JS天然支持了闭包。

闭包如何解析的

我们知道,JS代码的执行是解释执行的,并且是惰性解析的,即解释器在解析时不会去执行函数内的代码,不会生成AST和字节码,只有等到真正执行了函数时,才会去访问内部代码。 所以需要预解析器来解决函数内容闭包的问题。

预解析器

预解析器并不会跳过函数内部代码,会对函数内部代码做一次快速解析。 引入预解析器的目的有两个:

  1. 分析代码,是否有语法错误
  2. 检查函数内部是否引用了外部变量,如果引用了外部变量,会将变量从栈中移到堆中。下次执行到到函数时,直接从堆中取值。

这样即使父级函数的栈已经退出,但还是能拿到堆中的变量

上一次更新: