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:只有栈顶的上下文处于活动状态,执行代码