我们了解了V8引擎之后,我们要了解一下Javascript代码的执行顺序,包括:AO,GO,VO。干货满满......
假如说我们现在有以下代码:
var message = "hello";
function foo(){
var message = "foo";
console.log(message);
}
var num1 = 10;
var num2 = 20;
var reault = num1 + num2;
foo();那么他会是怎么执行的呢?
在我们执行任何执行上下文之前,都存在一个独一无二的全局对象global object。全局对象包含这几个属性:Math,String,parseInt,Date......。这里我们还可以说在全局变量中定义的message属于windows对象。相当于在html文档对象模型中,全局对象就是window本身。
GO是什么?
Go就是额外的宿主定义的属性,就相当于我们都属于地球。我们存在的Go就是地球,然而js也是有宿主的,他的宿主环境就是GO。英文global object说明他是一个对象。
- 在堆内存创建的一个全局对象,该对象所有作用域都可以访问,在浏览器中这个对象就是window
- 里面会有Math,String,parseInt,Date等这些方法。
- 其中还有一个window执向自己。
什么是执行上下文?
当程序的控制权交给EcmaScript执行代码的时候,控制权就会自动生成一个自动上下文栈。这里的顶部的执行上下文正好是当前运行的执行上下文。
Javascript内部有一个执行上下文简称ECS,他是用与执行代码的调用栈。
全局代码为了执行会创建一个GEC,GEC会被放到ECS中执行。
GEC被放到ECS中会包含两个部分:
- 在代码执行前,由代码通过parse转换为AST的时候,会将全局定义的变量,函数,对象等统一放入到
Golbal Object中,但是并不会赋值,这就是、变量的作用域提升。 - 在代码执行中,对变量赋值,或者执行其他函数
VO是什么?
VO是Variable Object的缩写,每一个函数上下文都会关联一个VO,其中变量和函数声明也会被添加到里面。当全局对象被执行的时候,VO就是GO了。
官方的解释
- 作用域链被创建和初始化只包含全局对象而不包含其他对象
- 变量实例是通过使用全局对象作为变量对象,并且使用其属性得来的。
- this的值是全局对象。


AO是什么?
当进入一个函数执行上下文时,会创建一个AO对象Actvation Object
这个AO会使用aarguments作为初始化,并且初始值是传入的参数。
这个AO对象会做为执行上下文的VO来存放变量的初始化。
ECMA文档中的介绍
当控制权进入一个函数的执行上下文时,一个成为激活对象的对象被创建,并与执行上下文关联,激活对象被初始化,拥有一个名为arguments的属性以及{DontDelete}属性。这个属性的初始是下面描述的参数对象。
激活多谢随后被用作变量实例化的变量对象。
AO执行图示
函数执行前

函数执行后
感谢大家观看
欣赏你的照片, 我明白, 世界很美。感谢 旅行灵感。
读起来像小说。继续保持 带来的灵感。
让人精神焕发的 帖子! 我准备订票了。
以后焦虑了或者迷茫了记得回来看看
我非常喜欢 出行博客。鼓舞人心查看路线。
你们的博客 百分百 帮助选择路线。坚持!
信息丰富的 出行资源! 越来越棒!
My brother suggested I might like this blog. He was entirely right. This post actually made my day. You cann't imagine just how much time I had spent for this information! Thanks!
我热爱, 写得很实在。你的博客 就是 最好的例子。很出色。
I've learn several good stuff here. Certainly price bookmarking for revisiting. I surprise how so much effort you put to make such a great informative website.