JavaScript 基础教程

JavaScript 首页 JavaScript 路线图 JavaScript 概述 JavaScript 功能特性 JavaScript 启用 JavaScript 位置 JavaScript 语法 JavaScript Hello World JavaScript Console.log() JavaScript 注释 JavaScript 变量 JavaScript let 语句 JavaScript 常量 JavaScript 数据类型 JavaScript 类型转换 JavaScript 严格模式 JavaScript 保留关键字

JavaScript 运算符

JavaScript 运算符 JavaScript 算术运算符 JavaScript 比较运算符 JavaScript 逻辑运算符 JavaScript 位运算符 JavaScript 赋值运算符 JavaScript 条件运算符 JavaScript typeof 运算符 JavaScript 空值合并运算符 JavaScript 安全赋值运算符 JavaScript 删除运算符 JavaScript 逗号运算符 JavaScript 分组运算符 JavaScript Yield 运算符 JavaScript 展开运算符 JavaScript 幂运算符 JavaScript 运算符优先级

JavaScript 控制流

JavaScript If...Else JavaScript While 循环 JavaScript For 循环 JavaScript For...in JavaScript For...of JavaScript 循环控制 JavaScript Break 语句 JavaScript Continue 语句 JavaScript Switch Case JavaScript 用户定义迭代器

JavaScript 函数

JavaScript 函数 JavaScript 函数表达式 JavaScript 函数参数 JavaScript 默认参数 JavaScript Function() 构造函数 JavaScript 函数提升 JavaScript 自调用函数 JavaScript 箭头函数 JavaScript 函数调用 JavaScript 函数 call() 方法 JavaScript 函数 apply() 方法 JavaScript 函数 bind() 方法 JavaScript 闭包 JavaScript 变量作用域 JavaScript 全局变量 JavaScript 智能函数参数

JavaScript 对象

JavaScript Number JavaScript Boolean JavaScript Strings JavaScript Arrays JavaScript Date JavaScript DataView JavaScript Handler JavaScript Math JavaScript RegExp JavaScript Symbol JavaScript Sets JavaScript WeakSet JavaScript Maps JavaScript WeakMap JavaScript 可迭代对象 JavaScript Reflect JavaScript TypedArray JavaScript 模板字面量 JavaScript 带标签的模板

面向对象的 JavaScript

JavaScript 对象 JavaScript 类 JavaScript 对象属性 JavaScript 对象方法 JavaScript 静态方法 JavaScript 显示对象 JavaScript 对象访问器 JavaScript 对象构造函数 JavaScript 原生原型 JavaScript ES5 对象方法 JavaScript 封装 JavaScript 继承 JavaScript 抽象 JavaScript 多态 JavaScript 解构 JavaScript 解构赋值 JavaScript 对象解构 JavaScript 数组解构 JavaScript 嵌套解构 JavaScript 可选链式调用 JavaScript 全局对象 JavaScript Mixins (混合) JavaScript 代理

JavaScript 版本

JavaScript 历史 JavaScript 版本 JavaScript ES5 JavaScript ES6 ECMAScript 2016 ECMAScript 2017 ECMAScript 2018 ECMAScript 2019 ECMAScript 2020 ECMAScript 2021 ECMAScript 2022

JavaScript 异步

JavaScript 异步 JavaScript 回调函数 JavaScript Promises JavaScript Async/Await JavaScript Microtasks (微任务) JavaScript Promises JavaScript Promises 链 JavaScript 定时事件 JavaScript setTimeout() JavaScript setInterval()

JavaScript Cookies

JavaScript Cookies JavaScript Cookie 属性 JavaScript 删除 Cookies

JavaScript 浏览器 BOM

JavaScript 浏览器对象模型 JavaScript Window 对象 JavaScript Document 文档对象 JavaScript Screen 对象 JavaScript History 对象 JavaScript Navigator 对象 JavaScript Location 对象 JavaScript Console 对象

JavaScript Web APIs

JavaScript Web API JavaScript History API JavaScript Storage API JavaScript Forms API JavaScript Worker API JavaScript Fetch API JavaScript Geolocation API

JavaScript 事件

JavaScript 事件 JavaScript DOM 事件 JavaScript addEventListener() JavaScript 鼠标事件 JavaScript 键盘事件 JavaScript 表单事件 JavaScript 窗口/文档事件 JavaScript 事件委托 JavaScript 事件冒泡 JavaScript 事件捕获 JavaScript 自定义事件

JavaScript 错误处理

JavaScript 错误处理 JavaScript try...catch JavaScript 调试 JavaScript 自定义错误 JavaScript 扩展错误

JavaScript 重要关键字

JavaScript this 关键字 JavaScript void 关键字 JavaScript new 关键字 JavaScript var 关键字

JavaScript HTML DOM

JavaScript HTML DOM JavaScript DOM 方法 &属性 JavaScript DOM 文档 JavaScript DOM 元素 JavaScript DOM 属性 (Attr) JavaScript DOM 表单 JavaScript 修改 HTML JavaScript 修改 CSS JavaScript DOM 动画 JavaScript DOM 导航 JavaScript DOM 集合 JavaScript DOM NodeList JavaScript DOM DOMTokenList

JavaScript 高级章节

JavaScript 冒泡排序算法 JavaScript 循环引用错误 JavaScript 使用 Jest 进行代码测试 JavaScript CORS 处理 JavaScript 数据分析 JavaScript 死区 JavaScript 设计模式 JavaScript Engine 和 Runtime JavaScript 执行上下文 JavaScript 函数组合 JavaScript 不可变性 JavaScript Kaboom.js JavaScript 词法作用域 JavaScript 本地存储 JavaScript 记忆化 JavaScript 压缩 JS JavaScript 可变性 vs 不可变性 JavaScript 包管理器 JavaScript 解析 S 表达式 JavaScript 原型继承 JavaScript 响应式 JavaScript Require 函数 JavaScript Selection API JavaScript SessionStorage JavaScript SQL CRUD 操作 JavaScript 增强排序 JavaScript 临时死区 JavaScript 节流 JavaScript TRPC 库 JavaScript 真值和假值 JavaScript 上传文件 JavaScript 日期比较 JavaScript 递归 JavaScript 数据结构 JavaScript Base64 编码 JavaScript 回调函数 JavaScript 当前日期/时间 JavaScript 日期验证 JavaScript 过滤方法 JavaScript 生成颜色 JavaScript HTTP 请求 JavaScript 插入排序 JavaScript 延迟加载 JavaScript 链表 JavaScript 嵌套循环 JavaScript 空值检查 JavaScript 获取当前 URL JavaScript 图算法 JavaScript 高阶函数 JavaScript 空字符串检查 JavaScript 表单处理 JavaScript 函数式编程 JavaScript 形参 vs 实参 JavaScript 原型 JavaScript 响应式编程 JavaScript Reduce 方法 JavaScript Rest 运算符 JavaScript 短路 JavaScript 未定义检查 JavaScript 单元测试 JavaScript 验证 URL

JavaScript 杂项

JavaScript Ajax JavaScript 异步迭代 JavaScript Atomics 原子对象 JavaScript Rest 参数 JavaScript 页面重定向 JavaScript 对话框 JavaScript 页面打印 JavaScript 表单验证 JavaScript 动画 JavaScript 多媒体 JavaScript 图像映射 JavaScript 浏览器 JavaScript JSON JavaScript 多行字符串 JavaScript 日期格式 JavaScript 获取日期方法 JavaScript 设置日期方法 JavaScript 模块 JavaScript 动态导入 JavaScript BigInt JavaScript Blob JavaScript Unicode JavaScript 浅拷贝 JavaScript 调用堆栈 JavaScript 引用类型 JavaScript IndexedDB JavaScript 点击劫持攻击 JavaScript 柯里化 JavaScript 图形 JavaScript Canvas 画布 JavaScript 防抖 JavaScript 性能 JavaScript 代码风格指南

JavaScript 实用资源

JavaScript 面试题 JavaScript 速查表 JavaScript 函数


JavaScript - Engine 和 Runtime(引擎和运行时)

JavaScript 引擎是一种执行 JavaScript 代码的计算机软件。它负责将人类可读的 JavaScript 代码转换为计算机硬件能够理解的指令。

当 JavaScript 代码在浏览器中执行时,它不会直接与计算机硬件交互。相反,它会与 JavaScript 引擎进行通信,JavaScript 引擎充当系统和代码之间的接口。

尽管每个浏览器都有自己的 JS 引擎,但 Google 的 V8 引擎是最常用的 JS 引擎。V8 引擎为用于构建服务器端应用程序的 Node.js 和 Google Chrome 提供支持。

在本章中,您将详细了解 JS 引擎是什么以及它是如何运作的 -

JavaScript 引擎如何工作?

任何 JS 引擎中都始终存在调用堆栈和堆。借助执行上下文,我们的代码在调用堆栈中运行。此外,堆是一个非结构化的内存池,用于存放应用程序所需的所有数据。

JavaScript Engine Working

既然您知道代码的执行位置,下一步就是了解如何将其编译成机器码,以便稍后运行。但我们首先来回顾一下编译和解释。

编译 vs 解释

在编译过程中,所有代码都会并发地转换为机器码,并存储在计算机可以运行的二进制文件中。

在解释过程中,解释器会逐行执行源代码。在程序运行时,代码仍然需要转换为机器码,但这次是逐行执行。

过去,JS 只是一种解释型语言。但是,现代 JS 引擎现在使用的是"即时"编译,即编译和解释相结合的编译方式。

使用 JIT 编译时,所有代码都会并发地转换为机器码并立即运行。

您可能想知道 JIT 和编译之间的区别。一个显著的区别是,机器码在编译后保存在一个可移植文件中。编译过程结束后无需着急,您可以随时运行它。

但是,使用 JIT 时,机器码必须在编译过程完成后立即执行。

JIT 和 JavaScript

让我们看看 JIT 在 JavaScript 中的具体工作原理。

因此,当一段 JavaScript 代码进入引擎时,第一步就是对其进行解析。

在解析过程中,代码会被转换为一种称为 AST(抽象语法树)的数据结构。其工作原理是,首先将每行代码分解成对语言来说重要的部分(例如,const 或 function 关键字),然后将所有这些部分以结构化的方式保存到树中。

此阶段还会判断是否存在语法错误。然后,生成的树将用于生成机器码。

JavaScript 中的 JIT

下一个阶段是编译。引擎获取抽象语法树 (AST) 并将其编译为机器码。由于使用了 JIT,机器码随后会被立即执行;请记住,此执行发生在调用堆栈上。

但这并非终点。当代 JavaScript 引擎为了尽可能快地运行程序,会生成浪费资源的机器码。然后,引擎获取预编译的代码,并在程序运行时对其进行优化和重新编译。所有这些优化都在后台进行。

到目前为止,您已经了解了 JS 引擎及其幕后的工作原理。让我们来看看什么是 JavaScript 运行时,尤其是浏览器运行时。

JavaScript 引擎列表

以下是可用的 JavaScript 引擎列表 -

浏览器 JavaScript 引擎名称
Google Chrome V8
Edge (Internet Explorer) Chakra
Mozilla Firefox Spider Monkey
Safari JavaScript Core Webkit

让我们简要了解一下上表中提到的每个引擎 -

  • V8:由 Google 为 Chrome 开发。它通过加速 JavaScript 执行来提升网站和应用程序的用户体验。此外,V8 通过收集多余信息来管理内存,并使在服务器端(例如在 Node.js 中)使用 JavaScript 变得更加容易。

  • Chakra:Chakra 由 Microsoft 为 Internet Explorer 开发。它通过在单独的 CPU 核心上运行脚本来加速 JavaScript 运行,并允许浏览器同时执行其他操作。

  • SpiderMonkey:Netscape 的 Brendan Eich 开发了第一个 JavaScript 引擎 SpiderMonkey,目前由 Mozilla 为 Firefox 维护。由于它是开源的,任何人都可以使用或修改它。

  • WebKit:WebKit for Safari 由 Apple 开发,并被 iOS 设备、Kindle 和 PlayStation 使用。WebKit 除了显示网页外,还管理历史记录和来回导航等常用浏览器功能。

什么是 JavaScript Runtime(运行时)?

JavaScript (JS) 运行时是用于执行 JavaScript 代码的完整环境。它由许多组件组成,这些组件协同工作,帮助 JavaScript 应用程序顺利运行。当我们谈论 JS 运行时时,我们通常指的是不仅仅是执行代码的完整生态系统。

根据 JavaScript 的执行位置(在 Web 浏览器中还是在带有 Node.js 的服务器上),运行时可能包含其他特定于环境的功能。例如,在浏览器中,可以有管理浏览器事件、访问 DOM 以及与浏览器特定功能交互的功能。

目前,我们只介绍浏览器中的 JavaScript 运行时。JS 运行时可以想象成一个大盒子,包含在浏览器中运行 JavaScript 所需的所有组件。

JS 引擎是任何 JS 运行时的核心。然而,仅有引擎是不够的。良好的功能需要 Web API。

JS 运行时,尤其是在 Web 浏览器中使用的运行时,包含扩展基本 JavaScript 语言功能的 Web API。这些 API 包括与文档对象模型 (DOM)、XMLHttpRequest(用于发送 HTTP 请求)、计时器等的交互。

Web API 扩展了 JavaScript 的功能,使其能够与浏览器环境交互并执行诸如更改网页结构、处理用户事件和发送网络请求等活动。

因此,Web API 基本上是引擎提供的功能,不属于 JavaScript 语言。JavaScript 通过 window 对象访问这些 API。

浏览器中的 JS 运行时

JavaScript 中的异步操作(例如接收用户输入或执行网络查询)会使用回调函数。这些例程被放置在回调队列中等待执行。回调队列以有序的方式管理异步任务。

为了响应特定事件,我们可以将事件处理程序方法附加到 DOM 事件(例如按钮)。这些事件处理程序函数也称为回调函数。因此,当点击事件发生时,回调函数将被调用。