JavaScript执行上下文

10,119 阅读3分钟

1. 什么是执行上下文?

执行上下文是评估和执行JavaScript的环境的抽象概念。每当JavaScript开始执行的时候,它都在执行上下文中运行。

2. 执行上下文的类型

执行上下文有三种类型:全局执行上下文、函数执行上下文、eval函数执行上下文。

全局上下文:是基础的、默认的上下文类型,任何不在函数内部的代码都在全局上下文中。它会执行两件事:创建一个全局的window对象,并且设置this的值等于这个对象,一个程序只有一个全局上下文环境。

函数上下文:每当一个函数被调用,就会为该函数创建一个新的上下文,每个函数都有他自己的上下文,函数上下文可以有任意多个。

eval函数执行上下文:执行在eval函数内部的函数也有自己的函数上下文 ,不是很常用。

3. 如何存储执行上下文:

    执行上下文被存在一个数据栈中,这个栈保存着代码运行是创建的所有上下文,栈的特点是后进先出(LIFO),也就是说,每创建一个新的上下文,就会将它压入栈的顶部,当函数执行完毕时,上下文从栈中弹出,控制流程到达栈中的下一个上下文当JavaScript引擎首次碰到脚本时,会创建一个全局的上下文,并将其压入栈中

4. 如何创建执行上下文:

创建一个执行上下文分为两个阶段:创建阶段执行阶段

在创建阶段,会发生三件事:绑定this指向创建词法环境组件创建变量环境组件

1)——this指向绑定:this的指向是在创建上下文时绑定的,它的指向决定于函数是如何被调用的,如果在全局执行上下文中,this指向全局对象,在浏览器中,全局对象就是window.如果在函数执行上下文中,如果函数是被对象调用的,那么this指向的就是这个对象,否则this指向的是全局对象或者是undefined。

**2)**词法环境:

      (1)什么叫词法环境:ES6中定义为是一种规范类型。一个词法环境由两部分组成:一个是环境记录器、一个是引用外部词法环境的空值。

            环境记录器:记录着变量和函数实际声明的位置。

            外部词法环境的空值:意味着可以他可以访问它的父级词法环境。

      (2)词法环境的类型:有两种,全局环境和函数环境。

3)变量环境:

      变量环境也是一个词法环境,它有着词法环境的一切属性。区别在于:词法环境用来存储函数和变量(let/const)的绑定,而变量环境用来存储var声明的变量绑定。

执行阶段:

  完成变量的分配,执行代码。

5. 参考文章: