第11期 执行上下文

155 阅读1分钟

执行上下文的类型

全局执行上下文

只有一个,在浏览器中是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)

执行上下文栈与作用域链

执行上下文栈是在代码执行时确定,作用域是在创建执行上下文时确定的。