概念
EC:函数执行环境(执行上下文)
ECS:执行环境栈
VO:变量对象
AO:活动对象
scope chain:作用域链
EC
当js引擎执行js代码时,就会进入到一个执行环境
js代码类型:
全局代码:这种类型的代码在程序启动时就会执行的代码。例如加载外部js文件,或者本地<script></script>标签内的代码,全局代码不包含函数体内的代码。
函数代码:任何一个函数内部的代码,不包括函数内部的函数的代码。其实每次进入一个函数内部都会新建一个执行上下文
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值将会确定
活动对象:活动对象就是被激活的对象,其实就是每次进入一个执行上下文,那么当前上下文的变量对象就是活动对象。