JavaScript的执行过程是什么样的?

JavaScript 的执行过程可以分为几个关键阶段,包括解析、编译、执行等。以下是详细过程:

1. 解析(Parsing)

解析是将 JavaScript 源代码转换为计算机可以理解的结构的过程。它分为两个阶段:

1.1. 词法分析(Lexical Analysis)

作用:将源代码字符串分解为有意义的词法单元(tokens)。

let x = 10 + 20;

如上代码会被分解为:

1. let(关键字)

2. x(标识符)

3. =(运算符)

4. 10(数字)

5. +(运算符)

6. 20(数字)

7. ;(分号)

1.2. 语法分析(Syntax Analysis)

作用:根据 JavaScript 的语法规则,将词法单元转换为抽象语法树(AST)。

let x = 10 + 20;

如上代码,对应的 AST 可能如下:

{"type": "VariableDeclaration","declarations": [{"type": "VariableDeclarator","id": { "type": "Identifier", "name": "x" },"init": {"type": "BinaryExpression","operator": "+","left": { "type": "Literal", "value": 10 },"right": { "type": "Literal", "value": 20 }}}],"kind": "let"
}

2. 编译(Compilation)

JavaScript 引擎(如 V8)会将 AST 转换为可执行的代码。现代 JavaScript 引擎通常使用即时编译(JIT)技术:

2.1. 即时编译(Just-In-Time Compilation, JIT)

1. 解释器:将 AST 快速转换为字节码并执行;

2. 编译器:将热点代码(频繁执行的代码)优化为机器码,以提高执行效率;

3. 优化策略:

(1). 内联缓存:缓存对象属性的访问路径;

(2). 逃逸分析:优化内存分配;

(3). 去优化:如果优化假设不成立,回退到解释器执行;

3. 创建执行上下文(Execution Context)

执行上下文是 JavaScript 代码执行的环境,分为三种类型:

1. 全局执行上下文:代码首次运行时创建,只有一个;

2. 函数执行上下文:每次函数调用时创建;

3. Eval 执行上下文:在 eval 函数中执行代码时创建(较少使用);

3.1. 执行上下文的组成

每个执行上下文包含以下内容:

1. 变量环境(Variable Environment):存储变量和函数声明;

2. 词法环境(Lexical Environment):用于作用域链的实现;

3. this 绑定:指向当前上下文的对象;

3.2. 执行上下文的生命周期

1. 创建阶段

(1). 创建变量对象(VO),初始化变量和函数声明;

(2). 建立作用域链;

(3). 确定 this 的值;

2. 执行阶段

(1). 逐行执行代码;

(2). 对变量赋值,执行函数调用;

4. 执行(Execution)

在代码执行阶段,JavaScript 引擎会逐行执行代码,并处理以下内容:

4.1. 变量和函数声明

1. 变量提升(Hoisting)

变量声明会被提升到作用域顶部,但赋值不会。

console.log(x); // undefined
var x = 10;

以上代码实际执行顺序:

var x;
console.log(x); // undefined
x = 10;

2. 函数提升

函数声明会被整体提升。

foo(); // "Hello"
function foo() {console.log("Hello");
}

4.2. 代码执行

同步代码:逐行执行。

异步代码:通过事件循环处理。

5. 事件循环(Event Loop)

事件循环是 JavaScript 处理异步操作的核心机制。它由以下部分组成:

5.1. 调用栈(Call Stack)

作用:用于跟踪函数调用,后进先出(LIFO)

function foo() {console.log("foo");
}
function bar() {foo();
}
bar();

调用栈过程:

1. bar() 入栈;

2. foo() 入栈;

3. console.log("foo") 入栈并执行;

4. foo() 出栈;

5. bar() 出栈;

5.2. 任务队列(Task Queue)

作用:存储异步任务的回调函数(如 setTimeoutsetInterval)。

执行时机:调用栈为空时,事件循环从任务队列中取出任务执行。

5.3. 微任务队列(Microtask Queue)

作用:存储高优先级的异步任务回调(如 PromiseMutationObserver)。

执行时机:在每个任务执行完成后,立即执行所有微任务。

5.4. 事件循环流程

1. 执行同步代码;

2. 检查微任务队列并执行所有微任务;

3. 检查任务队列并执行一个任务;

4. 重复上述过程;

6. 垃圾回收(Garbage Collection)

JavaScript 引擎会自动管理内存,回收不再使用的对象。主要算法包括:

6.1. 标记清除(Mark-and-Sweep)

步骤:从根对象(如全局对象)开始,标记所有可达对象。清除未标记的对象。

优点:能处理循环引用。

6.2. 引用计数(Reference Counting)

原理:记录每个对象的引用次数,当引用次数为 0 时回收。

缺点:无法处理循环引用。

6.3. 分代回收(Generational Collection)

原理:将内存分为新生代和老生代,分别采用不同的回收策略。

优点:提高回收效率。

7. 总结

JavaScript 的执行过程是一个复杂的机制,涉及解析、编译、执行上下文、事件循环和垃圾回收等多个阶段。理解这些细节有助于编写高效、可靠的代码,并更好地调试和优化性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25240.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:Top-K问题详解

一.Top-K问题 #include<stdio.h> //先自主创建n个数据 void CreateNDate() {// 造数据int n 100000;srand(time(0));//表示随时间初始化随机生成数的种子const char* file "data.txt";///创建一个文件FILE* fin fopen(file, "w");//“只写”写入创…

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行&#xff0c;无需一行 Java/Scala 代码&#xff0c;也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业&#xff0c;包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…

AI绘画软件Stable Diffusion详解教程(3):Windows系统本地化部署操作方法(通用版)

上一篇教程介绍了如何在本地部署Stable Diffusion专业版&#xff0c;虽然便于技术人员研究&#xff0c;但是普通人使用起来不便捷&#xff0c;每次只能通过cmd窗口的指令形式或者python代码方式来画图&#xff0c;要记很多的指令很繁琐。 本篇教程教您搭建webui版的&#xff0…

进程 ─── linux第10课

目录 回顾上一节 进程 基本概念 描述进程 - PCB task_struct - PCB的一种 task_ struct内容分类 组织进程 下面来介绍task_struct内部 PID 和PPID 子进程与父进程 getpid()和getppid() 杀进程 exe 和 cwd 回顾上一节 1. 如果我们写的程序要访问硬件,必定通过sy…

量子计算的数学基础:复数、矩阵和线性代数

量子计算是基于量子力学原理的一种新型计算模式,它与经典计算机在信息处理的方式上有着根本性的区别。在量子计算中,信息的最小单位是量子比特(qubit),而不是传统计算中的比特。量子比特的状态是通过量子力学中的数学工具来描述的,因此,理解量子计算的数学基础对于深入学…

PostgreSQL_安装部署

一、Windows系统下安装 1.下载安装包 登录PostgreSQL: Downloads官网&#xff1a; 选择14.12版本&#xff0c;点击下载&#xff1a; 2.安装PostgrSQL14.12 双击exe安装包程序&#xff0c;准备安装&#xff1a; 选择安装路径&#xff1a; 选择想安装的工具&#xff1a; 选择数…

Idea 和 Pycharm 快捷键

一、快捷键 二、Pycharm 中怎么切换分支 参考如下 如果在界面右下角 没有看到当前所在的分支&#xff0c;如 “Git:master” 3. 有了 4.

第十四届蓝桥杯:DFS之飞机降落

这道题&#xff0c;由于它的数据范围是非常小的&#xff0c;我们可以采取暴力搜索的措施&#xff0c;把每种情况都枚举出来&#xff0c;如果有能行的情况就返回true 同时我们也要学会剪枝&#xff0c;如果已经确认飞机不能降落&#xff0c;就不要往下再展开了 #include <i…

Oracle 查询表空间使用情况及收缩数据文件

本文介绍Oracle收缩数据文件的相关操作&#xff0c;运维工作中有时会需要通过收缩数据文件来释放磁盘空间。 数据文件初始化方式&#xff1a; 1.我们创建表空间一般有两种方式初始化其数据文件&#xff0c;即指定初始大小为32G&#xff08;很大的值&#xff09;或指定初始大小为…

android 新增native binder service 方式(一)

关于之前说的native service 之前有写过类似的文章&#xff0c;今天主要介绍下如何通过binder 方式跨进程调用和回调,结合网上的各种文章&#xff0c;总结了3种常见的添加方式&#xff0c;供大家参考。 一&#xff0c;aidl 文件定义 先看下整体的目录结构 libserviceaidl 就是…

【大模型系列篇】大模型微调工具 LLama-Factory、Unsloth、ms-SWIFT

今日号外&#xff1a;&#x1f525;&#x1f525;&#x1f525; DeepSeek团队正式启动为期五天的开源计划 Day3&#xff1a;DeepGEMM。DeepGEMM 是一个专为简洁高效的 FP8 通用矩阵乘法&#xff08;GEMM&#xff09;设计的库&#xff0c;具有细粒度缩放功能&#xff0c;如 Deep…

安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?

一、AugmentOS&#xff1a;AI可穿戴的“操作系统革命” 2025年2月3日&#xff0c;Vuzix与AI人机交互团队Mentra联合推出的AugmentOS&#xff0c;被业内视为智能眼镜领域的“iOS时刻”。这款全球首个专为智能眼镜设计的通用操作系统&#xff0c;通过三大突破重新定义了AI可穿戴…

自然语言处理(NLP):文本向量化从文字到数字的原理

在人工智能领域&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;中&#xff0c;将文本信息转化为机器可以理解的形式是一个至关重要的步骤。本文探讨如何将文本转换为向量表示的过程&#xff0c;包括分词、ID映射、One-hot编码以及最终的词嵌入&#xff08;Embeddin…

如何免费使用稳定的deepseek

0、背景&#xff1a; 在AI辅助工作中&#xff0c;除了使用cursor做编程外&#xff0c;使用deepseek R1进行问题分析、数据分析、代码分析效果非常好。现在我经常会去拿行业信息、遇到的问题等去咨询R1&#xff0c;也给了自己不少启示。但是由于官网稳定性很差&#xff0c;很多…

Cherry Studio + 火山引擎 构建个人AI智能知识库

&#x1f349;在信息化时代&#xff0c;个人知识库的构建对于提高工作效率、知识管理和信息提取尤为重要。尤其是当这些知识库能结合人工智能来智能化地整理、分类和管理数据时&#xff0c;效果更为显著。我最近尝试通过 Cherry Studio 和 火山引擎 来搭建个人智能知识库&#…

Python:循环

while循环&#xff1a; 基本格式如下&#xff1a; i1 while i<100: print(好好学习天天向上) i1 同理还有while循环嵌套&#xff1a; for循环&#xff08;迭代循环&#xff09; 基本格式&#xff1a; strhello for i in str print(i)#int整型不是迭代对象&#xff0c;需…

【leetcode hot 100 15】三数之和

一、两数之和的扩展 class Solution {public List<List<Integer>> threeSum(int[] nums) {// 将得到的结果存入Set中&#xff0c;保证不重复Set<List<Integer>> set new HashSet<>();// 模拟两数之和&#xff0c;作为第一个循环中的内容for(in…

Cesium高级开发教程之四十三:缓冲区分析#线

一、简介 基本概念:线缓冲区分析是指以 Cesium 中的线要素(如道路、河流等)为基础,在其两侧创建一定宽度的带状区域。例如,在地图上有一条河流的线数据,通过线缓冲区分析,可以得到河流两侧一定范围内的缓冲区域,用于表示河流的影响范围或进行相关的分析。实现原理:在 …

制造执行系统(MES)应用分析

全文概述 本文详细阐述了制造执行系统(MES)应用研究的主要内容,包括MES的定义、市场需求、企业选型与实施、应用现状、面临的挑战以及未来发展趋势。文章中基于广泛的行业调研,提供了详实的分析和见解。首先介绍了MES的基本概念和重要性,随后探讨了MES市场的投资、需求和选…

使用 VSCode 代替 BeyondStudio for NXP 开发 JN 5169

使用 VSCode 代替 BeyondStudio for NXP 开发 JN 5169 一、安装 VSCode二、搭建 NXP JN5169 ZigBee 3.0 开发环境和下载示例工程三、配置 VSCode1、配置环境变量 MYSYS_HOME2、VSCode 安装以下插件3、VSCode 配置头文件路径 四、编译工程1、JN-AN-1219 有 6 个构建选项2、修改 …