执行上下文的类型
全局执行上下文
只有一个,在浏览器中是window对象,首次运行代码时创建。
函数执行上下文
无数个,每次调用函数都会创建一个新的函数执行上下文。
eval函数执行上下文
运行在eval函数中的代码,很少用且不建议使用。
执行栈(调用栈)
存储执行上下文,先进后出。
一开始运行代码的时候,创建一个全局执行上下文并入栈,此时上下文控制权在全局执行上下文,当发生函数调用的时候,创建一个函数执行上下文并入栈,此时上下文控制权在此时入栈的函数执行上下文,该函数执行完后该函数执行上下文出栈,上下文控制权移交下一个执行上下文。
执行上下文创建
创建过程
生成变量对象(参考第12期 变量对象)
确认作用域链(参考第13期 作用域和闭包)
确定this指向(参考第14期 this)
执行过程
变量赋值 函数引用 执行其他代码
举例
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
// 执行上下文进展出栈顺序
push(global)
push(checkscope)
push(f)
pop(f)
pop(checkscope)
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();
// 执行上下文进展出栈顺序
push(global)
push(checkscope)
pop(checkscope)
push(f)
pop(f)
执行上下文栈与作用域链
执行上下文栈是在代码执行时确定,作用域是在创建执行上下文时确定的。