JavaScript在浏览器中经解析、编译、执行三阶段运行:先词法分析生成AST并检查语法;再由Ignition转字节码、TurboFan优化热点函数为机器码;最后通过调用栈、堆内存和事件循环协同执行,微任务优先于宏任务。

JavaScript 在浏览器中不是直接运行的“源代码”,而是经过解析、编译和执行三个核心阶段完成的。现代浏览器(如 Chrome、Firefox)使用即时编译(JIT)技术,在保证开发灵活性的同时提升运行效率。
1. 代码加载与词法分析(Parsing)
当浏览器遇到 标签或内联 JS,会先将字符流按语法规则切分成 token(如 const、name、=),再构建抽象语法树(AST)。这一步不执行代码,只检查语法是否合法——比如缺少右括号或用错关键字,就会在此报 SyntaxError。
2. 编译:从 AST 到可执行字节码(Ignition + TurboFan)
以 V8 引擎(Chrome / Edge / Node.js 使用)为例:
- Ignition 解释器将 AST 转为轻量级字节码,并收集运行时类型信息;
- 如果某函数被频繁调用(“热点函数”),TurboFan 编译器会将其进一步优化为高效机器码;
- 这个过程是动态的:代码可能先解释执行,热了再编译,甚至退化重编译(deoptimization)——比如变量类型突然改变。
3. 执行:调用栈、内存与事件循环协同工作
执行阶段依赖三大机制:
JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。本文将快速讲解 JSON 格式,并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理。
立即学习“Java免费学习笔记(深入)”;
-
调用栈(Call Stack):同步代码逐层入栈、出栈。函数调用推入,返回弹出;栈溢出(如无限递归)会抛
RangeError; - 堆(Heap):对象、数组等引用类型数据存在堆中,由垃圾回收器(GC)自动管理(如 V8 的 Orinoco);
- 事件循环(Event Loop):协调宏任务(script、setTimeout)、微任务(Promise.then、queueMicrotask)的执行顺序。每次宏任务结束后,清空全部微任务队列,再取下一个宏任务。
4. 实际调试建议:理解执行时机很关键
很多“为什么没按顺序执行”的困惑,源于对异步模型不熟。例如:
console.log(1);setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);
输出是 1 → 4 → 3 → 2,因为 Promise 回调是微任务,排在当前脚本(宏任务)之后、下一个 setTimeout 之前。










