javascript执行上下文的生命周期(接着上篇)

首先我们得看看执行上下文里有哪些东西:

大概包括:变量对象(VO),作用域链,this执行

其大概的生命周期就是:创建 -》 执行 -》 出栈等待垃圾回收机制回收

那么这个三个过程做了什么呢?用图表示:

 

 当然也有特殊情况比如闭包,这样子就不会被回收了,后面我会继续讲

怕有些同学不知道,我们这里讲清楚什么是VO和AO

VO和AO其实是一样的东西;

VO变量对象(Variable Object):是JS的执行上下文中都有一个对象用来存放执行上下文中可以访问到但是不能被删除的的函数标识符、形参、变量声明等

OA激活对象 (Activation Object) :有了变量对象存每个执行上下文的东西,进入一个执行上下文时,这个执行上下文的变量对象就会被激活,

然后它上面的那些函数标识符、形参、变量声明等也会被访问到。

现在我们来看看这过程都做了什么?

创建阶段:

   1、创建作用域链

   2、创建变量对象(或者AO):

        首先初始化函数的参数arguments,初始化函数声明,初始化变量声明,函数高于变量,如果函数与变量同名,变量会被忽略

         a、然后创建arguments对象,检索上下文,初始化参数名称和值并创建引用复制

         b、扫描上下文的函数声明(并不是函数表达式):

              A、把发现的每一个函数声明放在变量对象上的属性上,就是每个函数的名称就是这个这个属性名称,指向函数引存在的内存中的引用。

               如果函数的名称一家存在,那就改写引用的指针

              B、扫描上下文的变量声明:

                     把发现的每个一个变量声明,在变量对象上以为变量的名称创建一个相应的属性名称,并赋初始化值undefined;

                      如果有相同的变量名称在对象上存在,则不做任何处理,继续下去扫描

               C、求出上下文内部的this值

 

执行阶段:

     执行变量的赋值,执行其他的代码

回收阶段:

      执行上下文出栈等待回收

执行上下文的周期大概就是这些。接下来我们用一段代码来画图表示:

var a = 1,
b = 2,
c = 3,
b1 = {name: 'b1'};

a = f(b, c)

function f(b, c) {
var t = 1,
m = 2
for (var i = 0; i < m; i++) {
console.log(i)
}

function f2() {
console.log('f2')
}
return b + c
}
画图表示这对代码的执行上下文:

   

 

 

 后面下篇我们再讲讲作用域链与this指向!

posted @ 2020-05-28 22:00  菜鸡前端  阅读(195)  评论(0)    收藏  举报