前言
作为一个前端开发人员,理解js中一些晦涩难懂的概念,比如闭包、作用域、变量提升等等,对我们很有帮助。
执行栈
执行堆栈用于存储代码执行期间创建的所有执行上下文。有FILO接口,也叫调用栈。运行JavaScript代码时,会创建一个全局上下文,并将其推送到当前执行堆栈。当函数调用发生时,引擎将为该函数创建一个函数执行上下文,并将其推到堆栈顶部。引擎将首先在调用栈的顶部执行函数,当函数被执行时,当前函数的执行上下文将从当前执行栈中移除。转到下一个上下文。
让a='Hello '函数第一个(){ console . log(' Inside first function ')第二个(). console . log(' Inside first function ')}函数第二个(){ console . log(' Inside first function ')}第一个(). console . log(' Inside Global execution context ')
执行上下文
我们可以理解,执行上下文是解析和执行js代码的环境的抽象概念。有三种类型的JavaScript执行上下文:
全局执行上下文:只有一个基本上下文。创建一个全局对象(例如:浏览器中的窗口),并将它指向该全局对象。函数执行上下文:每次调用函数时都会创建一个函数上下文。可以有无限多个函数上下文。Eval函数执行上下文:在eval函数中运行的代码将有自己的执行上下文(本文不讨论)。执行上下文创建
创建执行上下文可以分为两个阶段: 1。创造第二阶段。执行阶段
创作阶段
在创建阶段,JavaScript引擎将创建词典环境组件、变量环境组件和这个绑定(在全局上下文中,它指向全局对象。在函数执行的上下文中,这取决于函数的调用位置。)
词汇环境(词汇环境)
ES2015规范中词汇环境的描述
我们可以理解,词法环境是包含标识符(变量/函数的名称)和变量(实际对象:函数/原值/数组对象等)映射的数据结构。).
每个词法环境由两部分组成:环境记录(存储变量和函数声明的实际位置)和对外部环境的引用(可以访问其外部词法环境)
环境记录有两种类型:
声明性环境记录:存储变量和函数声明。对象环境记录:全局词汇环境。除了变量和函数声明,对象环境记录还存储全局绑定的对象。提示:对于函数执行上下文,环境记录还包含一个arguments对象,该对象包含传递给函数的索引和参数之间的映射以及函数参数的数量。
例如:
函数foo (a,b){ var c=ab }//参数对象参数3360 {0: 2,1: 3,长度: 2}环境变量
可变环境也是一个词法环境,因此它具有上面定义的词法环境的所有属性和组件。在ES6中,词汇环境组件和变量环境组件的一个区别是,前者用于存储函数声明和变量let和const绑定,而后者仅用于存储变量var绑定。
执行阶段
在执行阶段,将分配所有变量,并最终执行代码。执行上下文的代码分为两个阶段:
输入执行上下文代码执行let a=20 const b=30 var c函数multiple (e,f){ var g=20 return e * f * g } c=multiple(20,30)执行上述代码时,JavaScript引擎会创建一个全局上下文来执行全局代码。
此时的全球背景:
GlobalExectionContext={ //全局上下文词典环境: { //词法环境环境记录: { //环境记录类型:"对象",//类型//标识符a:未初始化,b:未初始化,multiply: func },outer: null,//对外部环境引用},变量环境: { //变量环境环境记录: { //环境记录类型:“对象”,c:未定义},外部:空,//对外部环境引用},此绑定:全局对象//此绑定}在执行阶段,变量会被赋值,此时的全局上下文变成:
GlobalExectionContext={词典环境: {环境记录: {类型: '对象,a: 20,b: 30,multiply: func },outer: null },VariableEnvironment: {环境记录: {类型: '对象,c :未定义}外部: null },ThisBinding:全局对象}当Java脚本语言引擎遇到函数乘法(20,30)的时候,会创建一个新的函数上下文:
FunctionExectionContext={词典环境: {环境记录: {类型: '声明性,参数: { 0: 20,1: 30,长度: 2 } },外部:全球词典环境},变量环境: {环境记录: {类型: '声明性,g:未定义},外部:全球词典环境之后执行上下文会进入执行阶段,此时的函数上下文:
FunctionExectionContext={词汇环境: {环境记录: {类型: '声明性,参数: { 0: 20,1: 30,长度: 2 } },外部:全局词汇环境},变量环境: {环境记录: {类型: '声明性,g: 20 },外部3:全局词汇环境当函数执行完毕后。会返回一个值并赋值给变量c,全局上下文被更新。更新完成后,代码执行完毕,程序结束。
参考文章
理解java描述语言中的执行上下文和执行栈
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。