执行上下文(Execution Context )和范围(Scope)
变量或函数的执行上下文定义了它可以访问的其他数据,以及它的行为方式。每个执行上下文都有一个关联的变量对象,所有定义的变量和函数都存在于该变量对象上。
每个函数调用都有自己的执行上下文。每当代码执行流入函数时,函数的上下文就会被推送到上下文堆栈中。函数完成执行后,堆栈被弹出,将控制权返回到先前执行的上下文。
在上下文中执行代码时,会创建变量对象的范围链。作用域链的目的是提供对执行上下文可以访问的所有变量和函数的有序访问。
**Execution context(执行上下文)**是一个对象,它包括:
- variable object,(变量对象),即激活对象,是函数的情况
- scope chain(作用域链),您可以将其视为外部作用域的链表
- 这个值
**Variable object(变量对象)**是一个抽象的东西,它可以是其中之一:
- global object(全局对象)在全局上下文中;
1. 创建GO(Global Object)对象;
2. 寻找变量声明作为GO的属性名,并赋值为undefined;
3. 寻找函数声明,放入作为GO的属性,并赋值为其函数体。
- activation object (激活对象)用于函数;
Activation object(激活对象)是一个持有的对象:
- 函数的正式参数
- 此函数的参数对象。
- 此函数内的任何变量和(命名)函数
1. 创建AO(Activation Object)对象,又叫执行期上下文;
2. 寻找形式参数和变量声明作为AO的属性名,并赋值为undefined;
3. 传入实际参数的值;
4. 在函数体内寻找函数声明,放入作为AO的属性,并赋值为其函数体
console.log("result1",test)
function test(test){
console.log("result2",test)
var test = 234;
console.log("result3",test)
function test(){}
}
test(1)
var test = 123;
console.log("result4",test)
## GO对象
**找形参和变量声明**
GO{
test:undefined
}
**在函数体里面找到函数声明值赋予函数体**
GO{
test:function test(test){...}
}
result1: function test(test){...}
**执行函数**
## 创建AO对象
**找形参和变量声明**
AO{
test:undefined
}
**将实参和形参统一**
AO{
test:1
}
**在函数体里面找到函数声明值赋予函数体**
AO{
test:function test(){}
}
**GO也有test AO优先 AO没有找GO**
result2:function test(){}
// var test = 234;
// result3:234
result4:123
**结果**
result1:function test(test){...}
result2:function test(){}
result3:234
result4:123
所以,激活对象只是可变对象的一种特例;
它基本上是一个容器,用于存放您可以在函数内按名称访问的所有本地内容,除了this。