2019-03-13 执行上下文、函数堆栈

概念

EC:函数执行环境(执行上下文)

ECS:执行环境栈

VO:变量对象

AO:活动对象

scope chain:作用域链

EC

当js引擎执行js代码时,就会进入到一个执行环境

js代码类型:

全局代码:这种类型的代码在程序启动时就会执行的代码。例如加载外部js文件,或者本地标签内的代码,全局代码不包含函数体内的代码。

函数代码:任何一个函数内部的代码,不包括函数内部的函数的代码。其实每次进入一个函数内部都会新建一个执行上下文

eval代码eval方法接收的代码片段

ec建立分为两个阶段:

进入执行上下文和执行阶段

进入执行上下文:函数已经被调用,但是未执行函数中的代码

执行阶段:变量赋值,函数引用,执行代码

可以将执行上下文(EC)看成一个对象

EC={

VO:{/* 函数中的arguments对象, 参数, 内部的变量以及函数声明 */},

this:{},

Scope:{/* VO以及所有父执行上下文中的VO */}

}

ECS

ecs是执行环境栈。执行环境栈是一个栈结构,里面存储的是执行上下文,当程序启动时,进入全局上下文并将全局上下文加入到执行环境栈(ECS),当调用函数时,会新建一个执行上下文(a),然后将这个上下文压入执行环境栈的顶部。如果在函数内部又调用一个函数,那么会继续新建一个执行上下文(b),然后将这个上下文压入执行环境栈的顶部(如果再调用其他的函数,继续重复上一个动作)。

当执行上下文b执行结束后,执行环境栈会将将b从栈中弹出,接着执行a。当栈中的上下文被执行完毕,会重新回到全局上下文

VO(变量对象)/AO(活动对象)

ao其实就是激活的vo

VO: {// 上下文中的数据 (变量声明(var), 函数声明(FD), 函数形参(function arguments))}

1:进入执行上下文时,VO的初始化过程

函数的形参:变量对象的属性,形参的名字为key,值为val,若没有传递参数,那么值为undefined

函数的声明:其属性的名与值都是函数对象创建出来的,如果变量对象已经同名的属性,那么替换它的值

变量声明:和形参一样,变量名字为key,值为undefined,当变量名字和函数名或者函数的参数名相同时,不会影响已经存在的属性。

注意:

function s(a) {

console.log(a);  // 1

  var a;

  a= 4;

  console.log(a)  // 4

}

s(1);

该过程有先后顺序

2:执行代码阶段,VO的一些属性undefined值将会确定

活动对象:活动对象就是被激活的对象,其实就是每次进入一个执行上下文,那么当前上下文的变量对象就是活动对象。


你可能感兴趣的:(2019-03-13 执行上下文、函数堆栈)