摘要:执行上下文的执行阶段,也有三个内容变量赋值函数引用执行其他代码。的简写,叫做活动对象。先说一下变量对象,它的结构大致如此,在函数被调用的时候被创建变量对象包含函数的形参函数声明变量声明,三个内容。
关于javascript中的变量对象和活动对象
前面的文章说到, 执行上下文的创建阶段,主要有三个内容:
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属性,这个也可以容易理解,全局对象它不是函数。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/84291.html
摘要:作用域的类别可以影响到变量的取值,分为词法作用域静态作用域和动态作用域。而,采用的就是词法作用域,或者叫静态作用域。 关于javascript中的作用域和作用域链 我GitHub上的菜鸟仓库地址: 点击跳转查看其他相关文章 文章在我的博客上的地址: 点击跳转 前面的文章说到, 执行上下文的创建阶段,主要有三个内容: 1、创建变量对象;2、初始化作用域...
摘要:闭包闭包是指有权访问另一个函数作用域中的变量的函数当某个函数被调用时,会创建一个执行环境及相应的作用域链。要注意通过第句声明的这个方法属于构造函数生成的对象,而不属于构造函数的变量对象,也就是说,并不存在于作用域链中。 看到评论里有仁兄建议我试试箭头函数,真是受宠若惊,本来写这篇文章也只是想记录写要点给自己日后看的。今天早上看到一篇总结javascript中this的文章JavaScr...
摘要:在此例中,在匿名函数被返回后,它的作用域链初始化为包含函数的活动对象和全局变量对象。函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象,结果就是只是的执行环境的作用域链会被销毁,其活动对象会留在内存中。 写在前面 注:这个系列是本人对js知识的一些梳理,其中不少内容来自书籍:Javascript高级程序设计第三版和JavaScript权威指南第六版,...
摘要:为了防止之后自己又开始模糊,所以自己来总结一下中关于作用域链和原型链的知识,并将二者相比较看待进一步加深理解。因此我们发现当多个作用域相互嵌套的时候,就形成了作用域链。原型链原型说完了作用域链,我们来讲讲原型链。 毕业也整整一年了,看着很多学弟都毕业了,忽然心中颇有感慨,时间一去不复还呀。记得从去年这个时候接触到JavaScript,从一开始就很喜欢这门语言,当时迷迷糊糊看完了《J...
摘要:以上简单总结了下对执行上下文和变量对象的理解,主要在于记录总结一下学习成果,目前文章的水平实在不敢谈分享。 执行上下文(Execution Context) 文章同步到github javaScript中的执行上下文和变量对象 JavaScript代码执行的过程,包括编译和执行两个阶段,编译就是通过词法分析,构建抽象抽象语法树,并编译成机器识别的指令,在JavaScript代码编译阶段...
阅读 1179·2021-09-03 10:44
阅读 555·2019-08-30 13:13
阅读 2783·2019-08-30 13:11
阅读 1918·2019-08-30 12:59
阅读 1011·2019-08-29 15:32
阅读 1567·2019-08-29 15:25
阅读 951·2019-08-29 12:24
阅读 1255·2019-08-27 10:58