js中的执行上下文(EC)和执行环境栈(ECS)

文章类型:Javascript

发布者:admin

发布时间:2023-03-03

第一部分:执行上下文(EC)

当js在执行代码的时候,会产生三种上下文

1属性:

a:变量对象(VO),

主要是包含变量、函数声明、函数形参,只能在全局上下文中访问,

有一个变量存放可被访问但是不能被删除的函数标识符、形参、声明等,会挂在上面,在js引擎上实现,不可在js环境中访问到活动对象

活动对象(AO):每进入一个执行上下文时,当前中的就被激活,就可以获取到内容了

b:作用域链(JS),采用词法作用域,变量定义时就确定了

c:this指向

2类型:

一:全局上下文,只有一个

var a = 10
globalContext.VO === globe
globalContext.VO = {
foo: <Function>,
}

二:函数执行上下文,存在无数个,函数调用时被创建

function foo(i) {
var b = 20
}
foo()

fooContext.VO === foo.AO
fooContext.AO {
i: undefined,
b: undefined,
arguments: <>
}

tip:1:函数优于变量提示,并且相同函数下一个会覆盖上一个

三:eval 执行上下文,运行在 eval 函数中的代码

第二部分:执行环境栈(ECS)

调用栈,具有 LIFO(后进先出)结构,用于存储在代码执行期间创建的所有执行上下文

执行过程:

创建全局上下文(caller)->自上而下->遇到函数->

函数执行上下文被push到执行栈顶层->

函数执行上下文被激活->执行函数中代码=>

caller挂起->函数执行完成callee被pop移除执行栈->控制器交给caller

var a=1;//1.进入全局执行上下文环境
function outter(){
var b=2;
function inner(){
var c=3;
console.log(a+b+c);
}
inner();//3.进入inner函数上下文环境
}
outter();//2.进入outter函数上下文环境

总结:

1:全局上下文只有一个,永远在栈底,浏览器关闭窗口时出栈

2:函数调用时创建自己上下文环境

3:只有栈顶的上下文处于活动状态,执行代码