JavaScript 执行上下文

前端 2019-10-17T16:22:46 浏览:139

当代码运行时,会产生一个对应的执行环境,在这个环境中,所有变量会被事先提出来(变量提升),有的直接赋值,有的为默认值 undefined,代码从上往下开始执行,就叫做执行上下文。执行上下文可以理解为当前代码的运行环境。在 JavaScript 中,运行环境主要包含了全局环境和函数环境。

1.执行上下文(Execution Context)概念:

在 JavaScript 代码运行过程中,最先进入的是全局环境,而在函数被调用时则进入相应的函数环境。全局环境和函数环境所对应的执行上下文我们分别称为全局上下文和函数上下文。

在一个 JavaScript 文件中,经常会有多个函数被调用,也就是说在 JavaScript 代码运行过程中很可能会产生多个执行上下文,那么如何去管理多个执行上下文呢?

执行上下文是以栈的方式被存放起来的,我们称之为执行上下文栈(Execution Context Stack)。在JavaScript代码开始执行时,首先进入全局环境,此时全局上下文被创建并入栈,之后当调用函数时则进入相应的函数环境,此时相应函数上下文被创建并入栈,当处于栈顶的执行上下文代码执行完毕后,则会将其出栈。

注:如果看过盗梦空间的人,完全可以将此与盗梦空间的情节相结合,首先我们进入第一层梦(雨中都市 ,梦主为药剂师约瑟夫)可以理解进入全局环境,此时全局上下文被创建并入栈,之后进入第二层梦(酒店,梦主为阿瑟),此时第二层相应的场景被创建,之后进入第三层梦(雪山中的堡垒,梦主为伪造者伊姆斯),此时第三层相应的场景被创建…当最后一层任务执行完成后,场景消失回到上一层,以此类推直到回到第一层,任务完成后回到现实。《盗梦空间》中,从梦境中醒过来是需要有人唤醒,在第一层梦境中,唤醒方式只需要下坠就行,第二层梦境是被杀死,第三层和第四层需要有人在第一层和第二层留守唤醒,比如身在第三层,那么死了之后,必须有个人在第二层留守唤醒,而第二层唤醒之后,需要有人在第一层唤醒,层层类推,最后回到现实世界。

所以在执行上下文栈中,栈底永远是全局上下文,而栈顶则是当前正在执行的函数上下文。

2.执行上下文生命周期

1.创建阶段

(1).生成变量对象

(2).建立作用域链

(3).确定 this 指向

2.执行阶段

(1).变量赋值

(2).函数引用

(3).执行其他代码

3.销毁阶段

执行完毕出栈,等待回收被销毁

在一个执行上下文中,最重要的三个属性分别是变量对象(Variable Object)、作用域链(Scope Chain)和 this 指向。