首页 > 技术文章 > javascript执行上下文

olive1209 2017-07-01 15:46 原文

在这篇文章里,我想讲一讲关于javascript中最基本的部分,就是执行上下文。执行上下文的英文全称是:execution context

 

先讲讲EC—执行环境或者执行上下文

每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文js中,EC分为三种:

全局级别的代码 –– 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境。

函数级别的代码 ––当执行一个函数时,运行函数体中的代码。

③Eval的代码 –– 在Eval函数内运行的代码。

 

EC建立分为两个阶段:进入执行上下文(创建阶段)和执行阶段(激活/执行代码)。

进入上下文阶段:发生在函数调用时,但是在执行具体代码之前(比如,对函数参数进行具体化之前) 
创建作用域链(Scope Chain)
创建变量,函数和参数。
”this“的值。
执行代码阶段: 
变量赋值
函数引用
解释/执行其他代码。
我们可以EC看做是一个对象。

 

EC={

VO:{/*函数中的argument对象,参数,内部的变量以及函数声明*/}

this{}

Scope{/*VO以及所有父级执行上下文中的VO*/}

}

 

当浏览器首次载入你的脚本,它将默认进入全局执行上下文。如果,你在你的global代码中调用一个函数,你程序的时序将进入被调用的函数,并穿件一个新的执行上下文,并将新创建的上下文压入执行栈的顶部。

如果你调用当前函数内部的其他函数,相同的事情会在此上演。代码的执行流程进入内部函数,创建一个新的执行上下文并把它压入执行栈的顶部。浏览器将总会执行栈顶的执行上下文,一旦当前上下文函数执行结束,它将被从栈顶弹出,并将上下文控制权交给当前的栈。

 

VO—变量对象

每一个EC都对应一个变量对象VO,在该EC中定义的所有变量和函数都存放在其对应的VO中。

VO分为全局上下文VO(全局对象,Global object,我们通常说的global对象)和函数上下文的AO。

 

AO活动对象

在函数的执行上下文中,VO是不能直接访问的。它主要扮演被称作活跃对象(activation object)(简称:AO)的角色。 
    这句话怎么理解呢,就是当EC环境为函数时,我们访问的是AO,而不是VO。AO是在进入函数的执行上下文时创建的,并为该对象初始化一个arguments属性,该属性的值为Arguments对象

 

 

 

 

推荐阅读