javascript执行上下文
Posted yueyang2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript执行上下文相关的知识,希望对你有一定的参考价值。
在这篇文章里,我想讲一讲关于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对象。
以上是关于javascript执行上下文的主要内容,如果未能解决你的问题,请参考以下文章