【javaScript】执行原理
执行原理
相关文章
执行原理
一、执行过程
示例
1 |
|
词法分析(Lexical Analysis)
在词法分析阶段,JavaScript 引擎会将源代码分解成一个个称为词法单元(Token)的最小单位。
输入:JavaScript 代码字符串。
输出:词法单元序列。
1 |
|
语法分析(Syntax Analysis)
在语法分析阶段,JavaScript 引擎将词法单元序列根据 JavaScript 的语法规则构建成抽象语法树(AST)。
输入:词法单元序列。
输出:抽象语法树(AST)。
1 |
|
语义分析(Semantic Analysis)
在语义分析阶段,JavaScript 引擎对已构建的抽象语法树(AST)进行分析,检查代码中的语义错误,并进行类型检查和语义检查等操作。
输入:抽象语法树(AST)。
输出:检查通过或错误信息。
代码生成(Code Generation)
在代码生成阶段,JavaScript 引擎将已经经过词法分析、语法分析和语义分析的源代码转换为目标代码,通常是机器码或中间代码。
输入:抽象语法树(AST)。
输出:目标代码。
语义分析(Semantic Analysis)
在代码执行阶段,JavaScript 引擎按照生成的目标代码进行执行。
输入:目标代码。
输出:运行结果。
二、JavaScript 引擎
JavaScript 引擎是负责解释和执行 JavaScript 代码的程序,常见的 JavaScript 引擎包括 V8(Chrome 和 Node.js 使用)、SpiderMonkey(Firefox 使用)、JavaScriptCore(Safari 使用)等。引擎会将 JavaScript 代码分析、编译成字节码或机器码,并执行。
三、执行环境(Execution Context)
执行环境是 JavaScript 引擎执行代码的环境,它包含了执行代码所需的所有信息,如变量、作用域链、this 等。在执行 JavaScript 代码时,引擎会创建执行环境,并将其压入执行栈(Execution Stack)中。执行环境分为全局执行环境和函数执行环境。
构造过程
创建变量对象(Variable Object)
- 在创建执行环境时,JavaScript 引擎会首先创建一个变量对象,用于存储当前执行环境中的变量、函数声明以及形参信息。
- 对于全局执行环境,变量对象被称为全局对象(Global Object),在浏览器中是 window 对象。
- 对于函数执行环境,变量对象分为活动对象(Activation Object)和作用域链(Scope Chain)。活动对象用于存储函数内部的变量、函数声明和形参,作用域链用于解析变量的访问。
建立作用域链(Scope Chain)
- 执行环境中的作用域链是一个由多个对象组成的链表,用于解析变量的访问。
- 作用域链的顶端是当前执行环境的变量对象,依次往下包含了外部环境的变量对象,直到全局执行环境的变量对象。
- 当访问变量时,JavaScript 引擎会沿着作用域链逐级向上查找,直到找到变量或到达全局对象。
确定 this 值
- 在构造执行环境时,JavaScript 引擎还会确定当前执行环境中 this 的值。
- 对于函数执行环境,this 的值取决于函数的调用方式,可能是全局对象、调用函数的对象或者指定的对象。
初始化作用域链上的变量和函数声明
- 在执行环境创建完毕后,JavaScript 引擎会将当前执行环境中的变量和函数声明进行初始化。
- 对于变量声明,会将变量初始化为 undefined;对于函数声明,会将函数初始化为可调用的函数对象。
设置执行上下文的特殊属性
- JavaScript 引擎还会为执行环境设置一些特殊属性,如函数的 [[Scope]] 内部属性用于保存作用域链,函数的 [[ThisBinding]] 内部属性用于保存 this 值等。
四、事件循环(Event Loop)
JavaScript 是单线程执行的语言,但是它能够处理异步操作,这是通过事件循环实现的。事件循环是一个持续运行的循环,不断地从任务队列中取出待执行的任务,并执行它们。