首页 > 编程语言 > 详细

理解JavaScript中的事件循环(一):执行上下文机制

时间:2021-05-24 00:50:58      阅读:27      评论:0      收藏:0      [点我收藏+]

理解JavaScript中的事件循环(一):执行上下文机制

一:执行上下文与执行上下文栈

在JavaScript中,执行上下文(Excution Context)是对JavaScript代码被解析和执行的环境的抽象,所有正在运行的JS代码本质上是在执行上下文中运行。在任何时刻,每个代理中至多只有一个执行上下文正在执行代码,这个执行上下文被称为“正在运行的执行上下文”(running execution context)。执行上下文共有三种类型:1.函数执行上下文:每个函数在被调用时都会创建自己的函数执行上下文,用于执行函数内的代码。2.全局执行上下文:全局执行上下文用于执行所有JavaScript函数之外的代码。3.eval函数执行上下文:用于执行运行在eval函数中的代码。

执行上下文栈用于跟踪JavaScript代码执行期间创建的所有执行上下文,具有先进后出的特性。在JavaScript代码执行伊始,全局执行上下文将被创建并压入执行上下文栈。随后,每当发生函数调用,引擎都会为该函数创建执行上下文并将其压入执行上下文栈。当函数执行完毕,相应的执行上下文会从执行上下文栈中弹出。下面的代码展示了执行上下文栈的工作机制。

 1 let a = ‘Hello World!‘;
 2 
 3 function first() {
 4     console.log(‘Inside first function‘);
 5     second();
 6     console.log(‘Again inside first function‘);
 7 }
 8 
 9 function second() {
10     console.log(‘Inside second function‘);
11 }
12 
13 first();
14 console.log(‘Inside Global Execution Context‘);
15 
16 // Inside first function
17 // Inside second function
18 // Again inside first function
19 // Inside Global Execution Context

技术分享图片

需要注意的是,上文提到的“正在运行的执行上下文”总是位于执行上下文栈的栈顶,当JavaScript程序的控制权从与当前正在运行的执行上下文关联的可执行代码转移到不与正在运行的执行上下文关联的可执行代码时,引擎将会创建用于执行这些代码的执行上下文,并将其压入执行上下文栈作为栈顶元素,该执行上下文还将作为新的正在运行的执行上下文。

二:this绑定

在创建执行上下文时,需要确定与该执行上下文相关联的this值(This Binding)。对于全局执行上下文,其this值指向全局对象(window,global)。对于函数执行上下文,其this值的指向取决于相应函数的调用方式。

三:词法环境:

词法环境是执行上下文的重要组件,也是实现闭包的基础。ES规范对词法环境的定义如下:

"A Lexical Environment is a specifification type used to defifine the association of Identififiers to specifific variables and
functions based upon the lexical nesting structure of ECMAScript code."
“词法环境是基于ECMAScript代码的词法嵌套结构定义标识符与特定变量与函数的关联的规范类型。”
一个词法环境由环境记录(Environment Record)和可能为null的对外部词法环境的引用组成。通常,词法环境与ECMAScript代码中的特定语法结构相关联,例如函数声明(FunctionDeclaration)和语句块(BlockStatement)。作为词法环境的组件,环境记录存储了在与其关联的词法环境的作用域内创建的标识符绑定,而对外部环境的引用指向在逻辑上包围当前词法环境的外部词法环境。
 
词法环境可以分为三类:1.全局环境(global environment)是全局执行上下文的一个组件,其外部环境引用为null。全局环境的环境记录包含了一个全局对象,这个全局对象为全局对象提供了一些标识符绑定(全局对象上的属性和方法,用户自定义的全局变量等)。2.模块环境(module environment)的外部环境引用指向全局环境,其环境记录包含了模块顶级声明提供的标识符绑定和显式导入的标识符绑定。3.函数环境(function environment)与对ECMAScript函数对象的调用相关联,函数环境可能会建立新的new绑定,这取决于函数的调用方式。函数环境中的外部环境引用可以指向全局环境,也可以指向在逻辑上包含该函数环境的外部函数环境。函数环境的环境记录包含了一个arguments对象,arguments对象存储了参数列表的长度、索引与实参的映射等信息。
 
ES规范将词法环境的环境记录也分为了两类:声明环境记录(declarative Environment Records)和对象环境记录(object Environment Records)。声明环境记录适用于类似函数声明和变量声明这种将标识符绑定与值直接关联在一起的场景,而对象环境记录则适用于with语句这类将标识符绑定与对象属性关联在一起的场景。函数环境通常包含了声明环境记录,而全局环境通常包含了对象环境记录。
 
另外需要注意的是,变量环境(VariableEnvironment)同样也是执行上下文的组件之一。变量环境与词法环境的区别在于变量环境的环境记录中只包含在当前执行上下文内由变量声明语句(VariableStatements)创建的绑定。具体而言,词法环境的环境记录存储由let和const创建的绑定,而变量环境的环境记录存储由var创建的绑定。

理解JavaScript中的事件循环(一):执行上下文机制

原文:https://www.cnblogs.com/ccpeng/p/14802607.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!