首先关于整个生命周期,最重要的是要了解它的编译过程。
- 发现有代码调用了一个函数
- 在执行这个function之前,创建一个执行上下文(execution context),也可以叫执行环境。
- 进入创建阶段(VO创建)
a. 初始化作用域链(scope chain)
b. 创建变量函数(variable object / VO)
c. 创建参数对象(arguments object,传进来的参数),检查上下文,初始化其名字和值,以及建立引用对象的拷贝。
d. 扫描上下文中的函数声明
e. 为每一个扫描到的函数声明在VO中创建一个属性,命名为函数的名字,指向了存储空间中的对应函数。
f. 如果函数名称已经存在了,这个引用指针将被重写为新的这一个。
g. 扫描上下文中的变量声明
h. 为每一个扫描到的变量声明在VO中创建一个属性,命名为变量的名字,初始化值为undefined。
i. 如果变量名在内存中已经存在了,就跳过。
j. 决定上下文中this的指向。 - 执行阶段(VO => AO)
a. 执行/解释上下文中的function,为变量赋值
b. 代码按行执行
就我个人理解,他们的相应概念和包含内容如下。
scope :变量/函数起作用的区域
scope chain : 保证对执行环境有权访问的所有变量和函数的有序访问。相当于VO + [scope]
我们可以将作用域定义为一套规则,用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找,作用域链是这套规则的具体实现。
execution context = {VO, this, [scope]}
this : 函数/方法的拥有者