执行上下文
·前序
ES3
- 在ES3中,JavaScript执行上下文是指在代码
执行期间创建的环境,其中包含了变量、函数、对象等信息。每个执行上下文都有一个与之关联的变量对象,用于存储该上下文中定义的变量和函数。 - 在ES3中,执行上下文的
创建和销毁是由JavaScript引擎自动管理的,开发者无法手动干预。同时,ES3中的执行上下文机制相对简单,没有ES6中的诸多特性,如块级作用域、let和const关键字等.
ES2018
- 在ES2018中,执行上下文被定义为一个抽象的概念,用于描述JavaScript代码在执行时的环境和状态。每当JavaScript代码开始执行时,都会创建一个新的执行上下文,并将其添加到执行上下文栈中。执行上下文栈是一个后进先出(LIFO)的数据结构,用于跟踪当前正在执行的代码的上下文。
执行上下文包含三个重要的组成部分
-
变量环境(Variable Environment):包含了当前执行上下文中的变量、函数声明和函数参数等信息。
-
词法环境(Lexical Environment):与变量环境类似,但是还包含了当前执行上下文所处的词法作用域。
-
this 值:指向当前执行上下文所属的对象。
执行上下文的创建过程可以分为两个阶段
-
创建阶段(Creation Phase):在这个阶段,JavaScript引擎会创建变量环境、词法环境和this值,并将它们添加到执行上下文中。同时,JavaScript引擎还会扫描当前执行上下文中的代码,查找所有的函数声明和变量声明,并将它们添加到变量环境和词法环境中。
-
执行阶段(Execution Phase):在这个阶段,JavaScript引擎会按照代码的顺序执行当前执行上下文中的代码。在执行过程中,JavaScript引擎会根据需要从变量环境和词法环境中读取变量和函数,并将它们添加到当前执行上下文的作用域链中。
·ES6·执行上下文
概念
执行上下文是评估和执行JavaScript代码的环境的抽象概念,js代码在运行的时候都是在执行和执行上下文中运行的
简单理解就是当前代码的执行环境,注意是执行环境。
执行上下文的类型
全局执行上下文:一个程序中只有一个全局上下文,任何不在行数内部的代码,都属于全局上下文,也就意味着this的指向是window对象(浏览器环境下)
函数执行上下文: 函数上下文是在函数被调用的时候创建的,函数上下文可以有 很多个,调用一次函数生成一个,执行顺序是函数被调用的顺序。
Eval函数执行上下文:日常开发不会用到,是在执行eval函数内部的代码市会有自己的执行上下文。
执行栈
执行栈,也就是在其它编程语言中所说的“调用栈”,是一种拥有 LIFO(后进先出)数据结构的栈,被用来存储代码运行时创建的所有执行上下文。
当 JavaScript 引擎第一次遇到你的脚本时,它会创建一个全局的执行上下文并且压入当前执行栈。每当引擎遇到一个函数调用,它会为该函数创建一个新的执行上下文并压入栈的顶部。
引擎会执行那些执行上下文位于栈顶的函数。当该函数执行结束时,执行上下文从栈中弹出,控制流程到达当前栈中的下一个上下文。
如何创建执行上下文
-----小序-----
执行上下文的作用是为程序提供查找变量的地方,因此,我们可以想到,所谓的执行上下文的创建流程,实际上是将程序中的变量声明进行处理,存储在执行上下文里 可以划分为以下几个步骤:
- 处理声明
- 找到所有全局中的var声明,找到所有的顶级全局函数声明(要和函数表达式进行区分),将其记录在全局对象中
- 找到顶级的了let,const,class记录在全局scope
- 检查重复定义
- 就是看全局scope有无重复声明的变量(有则报错)
- 需要注意的是,这里不止检查全局scope,还要检查全局scope和全局对象的冲突,但全局对象中可以重复注册 3.创建绑定 ·对变量进行初步赋值 ·var声明的变量被赋值为undefined ·函数声明会创建函数对象,然后让该变量指向该对象
创建时间:
- 全局执行上下文:在
代码执行之前创建,在JavaScript代码开始执行时创建的。当浏览器加载JavaScript文件时,它会首先创建全局执行上下文,然后开始执行代码。全局执行上下文包含了全局变量、函数和其他的JavaScript代码。 - 函数执行上下文:在
函数被调用时创建,当函数被调用时,JavaScript引擎会创建一个新的执行上下文,并将其压入执行上下文栈中。在函数执行完毕后,该执行上下文会被弹出栈。每个函数都有自己的执行上下文,它包含了函数内部的变量、函数参数、函数声明等信息。 - Eval 执行上下文:在 eval() 函数被调用时创建,它代表了 eval() 函数的环境,包括 eval() 函数中定义的变量、函数等。
总之,执行上下文是在代码执行之前创建的,它们代表了代码执行时的环境,包括变量、函数、参数等
创建过程:
主要有两个阶段:(1)创建阶段和(2)执行阶段
创建阶段——会发生三件事情
- this值的决定,就是this绑定
- 创建词法环境组件
- 创建变量环境组件
整体过程:
- 创建变量对象(Variable Object):JavaScript引擎会创建一个变量对象,用于存储当前执行上下文中的变量、函数声明和形参等信息。
- 建立作用域链(Scope Chain):JavaScript引擎会建立一个作用域链,用于解析变量和函数的作用域。
- 确定this指向:JavaScript引擎会确定当前执行上下文中的this指向。
- 执行代码:JavaScript引擎会执行当前执行上下文中的代码,包括变量赋值、函数调用、条件语句、循环语句等。
- 返回执行结果:JavaScript引擎会返回执行结果,如果是函数调用,则将返回值存储在调用栈中,等待下一次执行。
this绑定
在全局执行上下文中,this对象指向全局对象(浏览器环境指的是window)
在函数执行上下文中,this取决于该函数是否被调用,且是被什么调用,如果是一个引用对象调用,那么this会被设置成那个对象。
如果函数没有被调用,那么此时this的值会被设置成全局对象或者underfined(严格模式下,如果函数没有被绑定到任何对象上,函数执行上下文中的this会被设置为undefined。这是因为在这种情况下,函数没有任何上下文可依赖,因此this被设置为undefined。)
(这里在后续深入学习this调用时更改为:this的指向,是在函数被调用的时候确定的,在函数执行过程中,this一旦被确定,就不可更改了,严格模式下:如果调用者函数,被某一个对象所拥有,那么该函数在调用时,内部的this指向该对象。如果函数独立调用,那么该函数内部的this,则指向undefined,非严格模式下指向全局。)