三个属性:
变量对象 作用域链 和this
在ES5中只有两种上下文,就是全局上下文和函数上下文
全局上下文的变量对象初始化是全局变量
函数上下文的变量对象初始化就只有arguments对象
在进入执行上下文时,会给变量对象添加变量声明,函数声明和形式参数
当函数执行时,会再次去修改变量对象的值
举个例子来说吧:
function foo(a){
var b=3;
function c(){};
var d = function(){}
b=4;
}
foo(1);
在进入执行上下文时,变量对象是:
AO{
arguments:{
0:1 ,//第一个参数
length:1
},
a:1,
b:undefined,
c:function,
d:undefined
}
当函数执行时:(会再次修改变量对象的值)
此时变量对象将变为活动对象AO:
AO{
arguments:{
0:1,
length:1
},
a:1,
b:4,
c:function,
d:reference to functionexpression d
}
值得注意的是,在执行上下文中,首先得到处理的是函数声明,其次是处理变量声明。
如果变量名称跟已经声明的形参或函数相同的话,它将不会影响这些已经存在的属性
比如说:
console.log(foo);
function foo(){
console.log("2");
}
var foo = 1;
执行的结果将是打印出函数,而不是1