执行上下文的生命周期分为两个阶段:
- 函数创建阶段:执行上下文创建变量对象,建立作用域链,确定this指向;
- 代码执行阶段:完成变量赋值,函数引用,以及执行其他代码。
变量对象(Variable Object)
其创建过程:
- 建立arguments对象,检查当前上下文中的参数,建立该对象下的属性和属性值;
- 检查当前上下文的函数声明,即用function声明的函数。再变量对象中以函数名建立属性,属性值为指向该函数的所在内存地址引用。如果该属性已存在,告诉该属性将会被新的引用所覆盖;
- 检查当前上下文的变量声明,找到变量及以变量名建立属性,属性值为undefined。如果变量名属性存在,防止同名函数被修改为undefined,直接跳过,原属性值不会被修改
如下例:1
2
3
4
5
6
7
8
9function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
test执行上下文的创建过程:
1 | // 创建过程 |
注:只有处于函数调用栈栈顶的执行上下文的变量对象,才能变成活动对象。
1 | // 执行阶段 |
全局上下文变量对象
1 | // 全局对象为window,全局上下文 |
参考文章:
变量对象–这波能反杀
如有错误,烦请指正,谢谢!