继续接着上篇文章,上篇我们说到函数上下文的结构可表示为
const ExecutionContextObj = {
VO: window, // 变量对象
ScopeChain: {
}, // 作用域链
this: window
};
即每个函数上下文,都要有这三个重要属性:
- 变量对象(Variable object, VO)
- 作用域链(Scope chain)
- this
今天再细说执行上下文中的变量对象
变量对象
1.什么是变量对象
变量对象是与执行上下文的相关的数据作用域,存储了在上下文中定义的变量和函数声明。因为不同执行上下文的变量对象略有不同,所以变量对象一般分为全局上下文下的变量对象和函数上下文下的变量对象。
2.变量对象(VO)的创建过程
变量对象的创建,属于执行上下文中的创建阶段,依次经过以下三个过程:
创建执行上下文有两个阶段:一个是创建阶段,一个是执行阶段。变量对象的创建,属于执行上下文中的创建阶段,会依次经过三个过程:
1.为函数的形参赋值(函数上下文)
在进入函数执行上下文时,会首先检查实参个数,接着对实参对象和形参进行赋值。如果没有实参,属性值设为undefined;当传入的实参数量小于形参数量,则会将没有被赋值的形参赋值为 undefined。
function fn(a, b, c){
console.log(a, b, c); // 1 2 undefined
}
fn(1, 2);
此时变量对象的结构为:
VO = {
a: 1,
b: 2,
c