felix-cao / Blog

A little progress a day makes you a big success!
31 stars 4 forks source link

JavaScript 执行上下文和执行上下文栈(Execution Context Stack简称ECS) #58

Open felix-cao opened 6 years ago

felix-cao commented 6 years ago

一、JavaScript 代码执行顺序

JavaScript 代码是从上到下顺序执行的,整个执行过程,分为两个阶段:

其中执行阶段具体流程如下:

而在这个执行上下文中,也分为创建阶段和执行阶段。接下来我们主要讨论函数环境的创建阶段和执行阶段,不考虑全局环境,因为全局环境也可以理解为在一个大的函数环境中。行为基本一致。

二、执行上下文

每当 Js 引擎转到可执行代码的时候,就会进入一个执行上下文。执行上下文可以理解为当前代码的执行环境,它会形成一个作用域。JavaScript 中的运行环境大概包括三种情况。

 注意:函数中,遇到 return 能直接终止可执行代码的执行,因此会直接将当前上下文弹出栈。

 执行上下文特点:

 - 单线程  - 同步执行,只有栈顶的上下文处于执行中,其他上下文需要等待  - 全局上下文只有唯一的一个,它在浏览器关闭时出栈  - 函数的执行上下文的个数没有限制  - 每次某个函数被调用,就会有个新的执行上下文为其创建,即使是调用的自身函数,也是如此。

三、执行上下文的生命周期

在上面的描述中,我们可以看出一个执行上下文的生命周期通常包含三个发展阶段:创建阶段、代码执行阶段、执行完毕阶段。

四、执行上下文栈(Execution Context Stack简称ECS)

引擎创建了执行上下文栈来管理执行上下文的顺序

栈stack是数据结构上的概念,用来处理数据的存放方式,特点为LIFO,即后进先出(Last in, first out)。

var a = 10;

function functionA() {

    console.log("Start function A");

    function functionB(){
        console.log("In function B");
    }

    functionB();

}

functionA();

console.log("GlobalContext");

  在浏览器中,javascript 引擎的工作方式是单线程的。也就是说,某一时刻只有唯一的一个事件是被激活处理的,其它的事件被放入队列中,等待被处理。下面的示例图描述了这样的一个堆栈:

Reference Doc