Skip to content

执行上下文栈 ​

本节目标:理解“执行上下文栈”的核心思路,并能把它用于实际开发或面试表达。

说明:原 OneNote 中有图片引用,但图片未包含在导出目录中;本页保留了可用的文字与代码内容。

**分类**
可执行代码分为下面三种:

全局执行代码,在执行所有代码前,解析创建全局执行上下文。

函数执行代码,执行函数前,解析创建函数执行上下文。
eval执行代码,运行于当前执行上下文中。
**作用**
执行上下文定义了变量或函数有权访问的其他数据。
**组成**
每一个执行上下文都由以下三个属性组成。
变量对象(Variable object,VO)
作用域链(Scope chain)
this
**执行上下文栈**
JavaScript 引擎创建了执行上下文栈(Execution context stack,ECS)来管理执行上下文。看下例了解执行上下文压栈是如何工作的。
var a = "global var";
function foo() {
    console.log(a);
}
function outerFunc() {
    var b = "var in outerFunc";
    console.log(b);
    function innerFunc() {
        var c = "var in innerFunc";
        console.log(c);
        foo();
    }
    innerFunc();
}
outerFunc();
==代码首先进入====Global Execution Context====,然后依次进入====outerFunc====,====innerFunc====和====foo====的执行上下文,执行上下文栈就可以表示为:==

==JavaScript== ==开始要解释执行代码的时候,最先遇到的就是全局代码,所以== ==JavaScript== ==引擎会先解析创建全局执行上下文,然后将全局执行上下文压栈。然后当执行流进入一个函数时,会先解析创建函数的执行上下文,然后将它的执行上下文压栈。而在函数执行之后,会将其执行上下文弹栈,弹栈后执行上下文中所有的数据都会被销毁,然后把控制权返回给之前的执行上下文。== ==创建上下文,压栈,执行代码,执行完后弹栈,销毁当前上下文数据,转交执行权给上一个执行上下文;== ==碰到函数时,创建函数上下文,压栈,执行代码,执行完后弹栈,销毁当前上下文数据,转交执行权;== ==注意,全局执行上下文会一直留在栈底,直到整个应用结束。==

本站总访问 — 次