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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ollama下载安装+本地部署DeepSeek+UI可视化+搭建个人知识库——详解!(Windows版本)

目录 1️⃣下载和安装Ollama 1. 🥇官网下载安装包 2. 🥈安装Ollama 3.🥉配置Ollama环境变量 4、🎉验证Ollama 2️⃣本地部署DeepSeek 1. 选择模型并下载 2. 验证和使用DeepSeek 3️⃣使用可视化工具 1. Chrome插件-Page …

数据库的sql语句

本篇文章主要用来收集项目开发中,遇到的各种sql语句的编写。 1、根据user表的role_id字段,查询role表。 sql语句:使用JOIN连接两个表 SELECT u.*,r.rolename FROM user u JOIN role r ON u.role_id r.id WHERE u.id 1; 查询结果&#xff1a…

Grok 3 vs. DeepSeek vs. ChatGPT:2025终极AI对决

2025 年,AI 领域的竞争愈发激烈,三个重量级选手争夺霸主地位:Grok 3(由 xAI 开发)、DeepSeek(国内 AI 初创公司)和 ChatGPT(OpenAI 产品)。每个模型都有自己独特的优势,无论是在深度思考、速度、编程辅助、创意输出,还是在成本控制方面,都展现出强大的实力。但究竟…

手机大厂如何处理安卓分屏退出后最近任务显示一半问题?

背景: 近来在有学员朋友在群里讨论到了一个分屏退出后,在桌面最近任务中的卡片显示异常问题,虽然他的问题和目前市场上的最近任务显示一半情况不一样。但是这里也刚好启发了群里vip学员们对这个最近任务对分屏task只显示一半画面问题进行相关…

Spring Cloud——路由网关Zuul

??? 哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!??? 【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。 【一心同学】博客…

WorldQuant Brain的专属语言——Fast Expression

使用brain需要的编程语言 在使用BRAIN平台时往往不需要事先有编码背景,因此小白也能很快对其上手,但有经验的程序员来讲,该平台暂时没有禁止API通信低强度进行时的程序化访问(但是非常不好意思😣怎么访问我没找到&…

人大金仓KCA | 对象访问权限入门

人大金仓KCA | 对象访问权限入门 一、知识预备1. 对象的分类2. 对象访问权限概述3. 级联授权4. 权限描述符5. 使用EasyKStudio查看用户权限 二、案例实施1. 用户授权综合案例2. 对象的创建者默认就是对象的所属主3. 该表对象的所属主4. 对象属主的权限设置5. 授权普通用户访问对…

StrokesPlus【电脑鼠标键盘手势软件】v0.5.8.0 中文绿色便携版

前言 StrokesPlus.net是一个超方便的手势识别软件,它能帮你用手势来代替鼠标和键盘操作。用起来既简单又灵活,功能还特别强大。 操作起来非常简单,它有好多实用的功能,比如智能识别你写的字、设定手势操作的区域、模拟鼠标的各种…

springBoot统一响应类型3.1版本

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…

DDD 架构之领域驱动设计【通俗易懂】

文章目录 1. 前言2. MVC 对比 DDD3. DDD 分层架构4. 完整业务流程 1. 前言 官方回答:DDD是一种应对复杂业务系统的设计方法,通过将软件设计与业务领域紧密结合,帮助开发人员构建清晰、可维护的领域模型。在复杂的业务系统中,它能…

LeetCode 889.根据前序和后序遍历构造二叉树

题目: 给定两个整数数组,preorder 和 postorder ,其中 preorder 是一个具有 无重复 值的二叉树的前序遍历,postorder 是同一棵树的后序遍历,重构并返回二叉树。 如果存在多个答案,您可以返回其中 任何 一…

SSM共享充电宝系统

🍅点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 SS…

Android 常用命令和工具解析之存储相关

1 基本概念 2 命令解读 2.1 adb shell df df 命令主要用于需要检查文件系统上已使用和可用的磁盘空间的数量。如果没有指定文件名,则显示在当前所有挂载的文件系统上可用的空间。其原理是从proc/mounts 或 /etc/mtab 中检索磁盘信息。 注意:df命令并…

51单片机编程学习笔记——LED原理图

大纲 概览LED电路图Resistor Pack3位数电阻表示法VCC 在《51单片机编程学习笔记——编译代码点亮LED》一文中,我们通过下面这段代码点亮了D1和D2两个LED灯。 sbit LED1P2^0; //将P2.0管脚定义为LED1 sbit LED2P2^1; //将P2.1管脚定义为LED2 …… LED10; LED20;那么…

测试的BUG分析

在了解BUG之前,我们要先了解软件测试的生命周期,因为大多数BUG都是在软件测试的过程中被发现的 软件测试的生命周期 在了解 软件测试的生命周期 之前,我们要先了解 软件的生命周期 ,虽然他们之间只差了两个字,但是差距还是很大的 首先是 软件生命周期 ,这个是站在 软件 的角…

vue3+ts实现动态下拉选项为图标

功能&#xff1a;实现可配置项&#xff0c;下拉选项为图标&#xff0c;如图&#xff1a; 代码如下&#xff1a; <el-select v-model"BuyVolAcc" size"small" style"width: 100%" class"icon-selector"><el-option v-for&qu…

C语言(15)-------------->一维数组

这篇文章介绍的是数组的定义、创建、初始化、使用&#xff0c;在数组中输入内容并输出数组中的内容&#xff0c;并探讨了数组在内存中的存储。里面有些内容建议大家参考下面的一些文章&#xff0c;有助于加深大家对于C语言的理解&#xff1a; C语言&#xff08;2&#xff09;-…

RISCV指令集解析

参考视频&#xff1a;《RISC-V入门&进阶教程》1-4-RV32I基本指令集&#xff08;1&#xff09;_哔哩哔哩_bilibili privilege是特权指令集&#xff0c;有点系统调用的感觉&#xff0c;要走内核态。unprivilege指令集有点像普通的函数调用。

2.27 链表中等 817

817. Linked List Components class Solution { public:int numComponents(ListNode* head, vector<int>& nums) {// 将 nums 存储到一个 unordered_set 中&#xff0c;方便 O(1) 查找unordered_set<int> numSet(nums.begin(), nums.end());int count 0;bool …

NFC拉起微信小程序申请URL scheme 汇总

NFC拉起微信小程序&#xff0c;需要在微信小程序开发里边申请 URL scheme &#xff0c;审核通过后才可以使用NFC标签碰一碰拉起微信小程序 有不少人被难住了&#xff0c;从微信小程序开发社区汇总了以下信息&#xff0c;供大参考 第一&#xff0c;NFC标签打开小程序 https://de…