Js作用域详及活动对象execution context详解,小白也能懂!

先给大家看几行代码;
var demo=“ian”;
function fuc(){
console.log(demo);//result:ian
}
fuc();

很明显 fuc()打印的是全局里的demo,下面重点分析原理;

先了解一个名词叫做执行环境(Exection Context),也有人称为执行期上下文。执行环境中包含了一个函数(全局)所有的变量及函数命名。每当函数开始执行时,会产生一个执行环境,其中所有代码执行完毕时该执行环境销毁(全局环境在程序退出后销毁)。

在创建执行环境的同时会创建作用域链scope不同的作用域之间通过作用域链联系在一起;在创建完执行环境后,会使用this,arguments(全局下不存在)创建活动对象。作用域链的前端(0)始终是当前函数对象(全局执行环境为window),作用域链后续位scope里面的属性值;
那上面的函数举个栗子:
Js作用域详及活动对象execution context详解,小白也能懂!

回到最开始那个问题:fun函数作用域内(scop[0])并没有demo这个变量,但它会沿着作用域链往后继续搜素,在全局作用域(scop[1])中找到demo并打印,结果为“ian”;

AO——activation object

在函数执行的前一刻产生的活动对象;看下面一段代码
console.log(x);
var x=5;

//result:undefined;

fuc1();
function fuc1(){
var a=1;
console.log(a);
console.log(b);
var b=2;
console.log(b);
}

//result:1 undefined

上面两个问题有老师总结口诀:变量声明提升,函数声明整体提升。下面我们来看原理:
函数每次执行的前一刻都会产生AO(全局的叫GO),按以下步骤
1.创建AO对象;
2.找变量声明和形参,变量名/形参名作为AO对象的属性,属性值为undefined
3.形参实参相统一
4.找函数声明;函数名为AO对象的属性,属性值为undefined
用上面的函数举个栗子:

1.首先创建AO对象
AO{ }

2.找变量声明和形参,
AO{ a:undifined;
b:undifined
} //本例只变量a、b没有形参

3.形参实参相统一
AO{ a:undifined;
b:undifined
} //由于本例没有实参,所以经过此步骤之后较之前并无变化

4 找函数声明
AO{a:undifined;
b:undifined
}
//本例的函数里面没有声明新的函数

接下来开始按照JS的规则从上往下执行函数里面的代码
先执行 a=1;*注意:这里将var a=1 拆分成 var a; a=1;刚才变量已经声明过了,所以这里只需要赋值就ok了;

执行过后AO为:{
a:1;
b:undifined
}

然后继续执行console.log(a);打印a //result:1
再执行console.log(b); //result:undefined
接着执行b=2:
AO为:{
a:1;
b:2;
}

然后再执行console.log(b); //result:2

作者也是只刚入门的菜鸟,有措辞不严谨的地方,还请多多包涵呐

@author:JFlyhak
@email:[email protected]