javascript如何工作_它的引擎执行流程是怎样的?

云晨姑娘_9874

云晨姑娘_9874

2026-01-10

349人浏览

原创

JavaScript有严格编译执行流程:先词法分析和语法解析生成AST,再初始化词法/变量环境形成作用域链,接着Ignition字节码与TurboFan JIT优化,最后由宿主事件循环调度宏微任务。

javascript如何工作_它的引擎执行流程是怎样的?

JavaScript 不是“边写边执行”的脚本语言,它有一套严格的编译与执行流程,理解这个流程能帮你解释 hoisting、ReferenceError、闭包生命周期等常见困惑。

引擎启动时先做词法分析和语法解析

V8(Chrome/Node)、SpiderMonkey(Firefox)等引擎一拿到 JS 代码,立刻进行两阶段静态处理:

  • 词法分析(Lexing):把源码切分成 token,比如 function、const、{、myVar、123
  • 语法解析(Parsing):用 token 构建抽象语法树(AST),例如 const x = 1 + 2 会生成含 VariableDeclaration、BinaryExpression 节点的树

如果这一步出错,你会看到 SyntaxError: Unexpected token '}' 这类错误 —— 它发生在任何代码执行前,连 console.log 都不会触发。

执行前必须完成变量环境与词法环境的初始化

函数调用时,引擎为该执行上下文创建两个关键结构:

  • LexicalEnvironment:存放 let/const 声明,初始值为 uninitialized(访问即报 ReferenceError)
  • VariableEnvironment:存放 var 和函数声明,会被提前初始化为 undefined(所以 var 有“变量提升”)
  • 二者都包含对父级环境的引用,构成作用域链

这就是为什么这段代码不报错但输出 undefined:

console.log(a); // undefined
var a = 1;

而这段直接崩溃:

console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 2;

字节码与即时编译(JIT)不是可选优化,而是执行核心环节

V8 不直接解释 AST 或生成机器码,它走的是三段式路径:

logos-node
logos-node

在 Linux x86_64 上安装、更新或检查 Logos 区块链测试网验证节点。用于用户需要搭建 Logos 节点时使用。

下载
  • AST → Ignition 字节码(轻量、内存友好,用于快速启动)
  • 运行中统计热点函数(如被调用超 100 次)→ 触发 TurboFan 编译为优化机器码
  • 若后续发现类型不稳定(比如某参数从 number 变成 string),则去优化(deoptimization),退回字节码执行

这意味着:typeof、instanceof、频繁的 try/catch 都可能阻碍 TurboFan 优化;而保持参数类型一致、避免在热函数里修改原型,能显著提升性能。

事件循环不是 JavaScript 引擎的一部分,而是宿主环境提供的调度机制

JS 引擎本身只管执行同步代码、管理调用栈与内存。真正决定“何时执行 setTimeout 回调”或“谁先拿到 Promise.then”的是宿主(浏览器或 Node.js)的事件循环实现:

  • 宏任务(macrotask):setTimeout、setInterval、I/O、UI render
  • 微任务(microtask):Promise.then、MutationObserver、queueMicrotask
  • 每次宏任务执行完,引擎会清空全部微任务队列,再取下一个宏任务

所以这段代码输出顺序是 1 → 3 → 2:

console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));

注意:setTimeout(..., 0) 并不等于“立刻执行”,它只是尽快排进下一个宏任务队列 —— 实际延迟取决于当前调用栈是否为空、微任务是否已清空。

真正难调试的,往往不是语法错误,而是你误以为“代码按书写顺序执行”,却忽略了词法环境初始化时机、JIT 的去优化行为、或者事件循环中宏/微任务的嵌套层级。这些地方没日志、不报错,但逻辑就是不对。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

3006

5

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.06

6279

7

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

2026.03.24

4487

22

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7579

3

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

2023.09.14

15566

6

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1805

5

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

2023.12.21

4377

3

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2024.03.01

6541

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2478

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习