关于javascript中的变量对象和运动对象
我GitHub上的菜鸟堆栈地点: 点击跳转检察其他相干文章
文章在我的博客上的地点: 点击跳转
前面的文章说到, 实行高低文的建立阶段,主要有三个内容:
1、建立变量对象;2、初始化作用域链;3、肯定this的指向。
实行高低文的实行阶段,也有三个内容:
1、变量赋值;2、函数援用;3、实行其他代码。
在这里先说一个条件,我提到的函数挪用,说的是实行高低文的第一阶段,建立阶段(还没最先实行函数体相干的代码),提到的函数实行,说的是实行高低文的第二阶段,实行阶段(最先实行函数体相干的代码)。
实在在说到实行高低文中的的变量对象的时刻,我印象中会冒出来两个英文简写:VO和AO。
VO:Variable Object的简写,就是变量对象。
AO:Activation Object的简写,叫做运动对象。
这两个东西有什么区分呢?
我的明白是,他们的区分就是在于实行高低文的差别生命周期阶段,变量对象VO在实行高低文的建立阶段,而运动对象AO在实行高低文的实行阶段。
先说一下变量对象,它的构造大抵云云,在函数被挪用的时刻被建立:
VO:{
arguments:Arguments,
FunctionName:reference to function FunctionName(){},
Variables:undefined
}
VO(变量对象)包括:函数的形参(arguments)、函数声明(FunctionDeclaration, FD)、变量声明(VariableDeclaration,var)三个内容。
简朴来讲,举个例子:
//声明example函数
function example(x){
var a = 10;
function plus(){
return a + x;
}
return plus();
}
//挪用example函数
example(5);
当挪用example函数的时刻,进入实行高低文的建立阶段,建立的变量对象为(自身看看什么是函数的形参、函数声明和变量声明):
VO:{
arguments:{x:undefined},
plus:reference to function plus(){},
a:undefined
}
当example函数最先实行的时刻,进入实行高低文的实行阶段,变量对象就会被激活,起首经由历程arguments属性初始化成为运动对象AO:
AO:{
arguments:{callee:example,x:5,length:1},
plus:reference to function plus(){},
a:undefined
}
固然了,arguments属性的值是Arguments对象,关于VO来讲,因为建立阶段只是形参,所以VO只需x一个undefined的值,而经由历程传入肯定的实参5初始化后,AO中的Arguments就多了指向自身函数callee和length两个属性了。
固然,AO对象是跟着实行代码的实行历程当中而变化的,跟着代码的实行,变量最先初始化,下一步AO就会变成:
AO:{
arguments:{callee:example,x:5,length:1},
plus:reference to function plus(){},
a:10
}
当另有其他变量的时刻,实行历程自行明白一下就好了。
所以高低文的实行阶段:变量赋值、函数援用、实行其他代码。这个历程也能够随意马虎明白了。
末了,想说一下全局高低文(或许叫做全局实行高低文)的VO和AO,实在人人也能够晓得,实在我们实行一切的代码,都是基于一个全局高低文上的,只需你不退出全局高低文(比方浏览器的话全局对象就是window,你不封闭窗口的话,全局高低文就不会跳出实行高低文栈),就一向都在全局实行高低文的实行阶段了,所以实行的阶段就已经是AO了。其次,自身没有arguments属性,这个也能够轻易明白,全局对象它不是函数。