执行上下文
编译器
程序语言编译机器语言的工具,编译器或语法编译器是一个能够逐行读取代码的程序。它了解代码如何匹配编程语言所定义的语法,以及代码应该做什么
JavaScript引擎
JavaScript引擎是一个计算机程序,它接收JavaScript源代码并将其编译成CPU可以理解的二进制指令(机器码)
JavaScript引擎通常是由浏览器供应商开发的,每一个主流浏览器都有一个自己开发的引擎。如:谷歌Chrome浏览器的 V8引擎,Firefox的SpiderMonkey和IE的Chakra
执行上下文
浏览器在读取HTML时,如果遇到了<script>
标签或包含JavaScript代码的属性如onClick,会发送给JavaScript引擎
浏览器的JavaScript引擎会创造一个特殊的环境来处理这些JavaScript代码的转换和执行。这个特殊的环境被称为执行上下文
执行上下文包含当前正在运行的代码和有助于其执行的所有内容
在执行上下文运行期间,编译器解析代码,内存存储变量和函数,可执行的字节码生成后,代码执行
全局执行上下文(GEC)
每当 JavaScript 引擎接收到脚本文件时,它首先会创建一个默认的执行上下文,称为 全局执行上下文 (GEC)
GEC是基础/默认的执行上下文,所有 不在函数内部的JavaScript代码
都在这里执行
函数执行上下文(FEC)
每当函数被调用时,JavaScript引擎就会在GEC内部创建另一种执行上下文,称为函数执行上下文(FEC),并在FEC中评估和执行函数中的代码
因为每个函数调用都创建自己的FEC,所以在脚本运行期间会有多个FEC
创建执行上下文
执行上下文(GEC或FEC)的创建分为两个阶段
- 创建阶段
- 执行阶段
创建阶段
执行上下文首先与执行上下文对象(ECO)相关联。执行上下文对象存储了许多重要的数据,执行上下文中的代码在运行时会使用这些数据
创建阶段分三个步骤来定义和设置执行上下文对象的属性:
- 创建变量对象(VO)--- 对象的容器,存储执行上下文中变量和函数声明(变量提升 未定义 undefined)
- 创建作用域链
- 设置
this
关键字的值
执行阶段
在执行阶段,JavaScript引擎会再次读取执行上下文,并用变量的实际值更新VO。编译器再把代码编译为计算机可执行的字节码后执行