JS作用域(2)- 生成

本篇初步介绍作用域的概念及产生过程。

执行期上下文

上篇说了函数在执行的前一刻,会进行预编译过程,创建一个执行期上下文对象:AO或GO。它定义了函数执行期的环境,且每次调用都会产生一个新的执行期上下文对象,在函数调用结束后,该对象立马销毁。

作用域

每个函数对象都会有一个[[scope]]属性,该属性就是函数的作用域,它存储了执行期上下文的集合,该属性只能JavaScript引擎调用。

作用域链

[[scope]]中存储的执行期上下文集合呈链式结构,我们把这种结构叫做作用域链。

作用域的生成过程

我们通过如下的一个函数来分析函数作用域的生成过程。


JS作用域(2)- 生成_第1张图片

首先,a函数在定义时,会生成如下作用域:


JS作用域(2)- 生成_第2张图片

然后,执行a函数,生成如下作用域:


JS作用域(2)- 生成_第3张图片

a函数执行时,b函数定义,b定义时,生成如下作用域,从图中可以看出,b在定义时的作用域直接指向a执行时生成的执行期上下文,它们共用相同的执行期上下文。


JS作用域(2)- 生成_第4张图片

b函数执行时,生成如下的作用域:


JS作用域(2)- 生成_第5张图片

当b执行完成后,b的作用域变回到b定义时的状态,同理,a执行完成后,a的作用域也变回到a定义时的状态。

通过作用域内部保存的作用域链,我们可以按照该链至顶向下查找变量(也即从函数内部向其外部查找)。

你可能感兴趣的:(JS作用域(2)- 生成)