本篇初步介绍作用域的概念及产生过程。
执行期上下文
上篇说了函数在执行的前一刻,会进行预编译过程,创建一个执行期上下文对象:AO或GO。它定义了函数执行期的环境,且每次调用都会产生一个新的执行期上下文对象,在函数调用结束后,该对象立马销毁。
作用域
每个函数对象都会有一个[[scope]]属性,该属性就是函数的作用域,它存储了执行期上下文的集合,该属性只能JavaScript引擎调用。
作用域链
[[scope]]中存储的执行期上下文集合呈链式结构,我们把这种结构叫做作用域链。
作用域的生成过程
我们通过如下的一个函数来分析函数作用域的生成过程。
首先,a函数在定义时,会生成如下作用域:
然后,执行a函数,生成如下作用域:
a函数执行时,b函数定义,b定义时,生成如下作用域,从图中可以看出,b在定义时的作用域直接指向a执行时生成的执行期上下文,它们共用相同的执行期上下文。
b函数执行时,生成如下的作用域:
当b执行完成后,b的作用域变回到b定义时的状态,同理,a执行完成后,a的作用域也变回到a定义时的状态。
通过作用域内部保存的作用域链,我们可以按照该链至顶向下查找变量(也即从函数内部向其外部查找)。
网友评论