【javaScript】执行原理

执行原理

相关文章

执行原理


一、执行过程

示例

1
2
3
4
5
6
function add(a, b) {
return a + b;
}

let result = add(3, 5);
console.log(result);

词法分析(Lexical Analysis)

在词法分析阶段,JavaScript 引擎会将源代码分解成一个个称为词法单元(Token)的最小单位。

输入:JavaScript 代码字符串。
输出:词法单元序列。

1
2
3
4
5
6
<keyword, function> <identifier, add> <delimiter, (>
<identifier, a> <delimiter, ,> <identifier, b> <delimiter, )>
<delimiter, {> <keyword, return> <identifier, a> <operator, +> <identifier, b> <delimiter, ;> <delimiter, }>
<keyword, let> <identifier, result> <operator, => <identifier, add> <delimiter, (>
<constant, 3> <delimiter, ,> <constant, 5> <delimiter, )> <delimiter, ;>
<identifier, console> <operator, .> <identifier, log> <delimiter, (> <identifier, result> <delimiter, )> <delimiter, ;>

语法分析(Syntax Analysis)

在语法分析阶段,JavaScript 引擎将词法单元序列根据 JavaScript 的语法规则构建成抽象语法树(AST)。

输入:词法单元序列。
输出:抽象语法树(AST)。

1
2
3
4
5
6
7
8
9
10
11
12
13
        FunctionDeclaration
|
Identifier (add)
/ \
Identifier (a) Identifier (b)
|
BlockStatement
|
ReturnStatement
|
BinaryExpression (+)
/ \
Identifier (a) Identifier (b)

语义分析(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 是单线程执行的语言,但是它能够处理异步操作,这是通过事件循环实现的。事件循环是一个持续运行的循环,不断地从任务队列中取出待执行的任务,并执行它们。

详细介绍


喜欢这篇文章?打赏一下支持一下作者吧!
【javaScript】执行原理
https://www.cccccl.com/20210504/javascript/执行原理/
作者
Jeffrey
发布于
2021年5月4日
许可协议