JavaScript运行原理详解:语法分析、预编译与解释执行
本文详细解析JavaScript引擎执行代码的三个阶段:语法分析、预编译与解释执行。重点阐述预编译过程中的变量提升、函数声明提升及暗示全局变量机制,并深入剖析函数执行前的预编译四部曲(创建AO对象、处理形参与变量、统一实参、查找函数声明),帮助开发者掌握JS底层执行逻辑。
1.1 语法分析
在正式进行预编译之前,JavaScript引擎会先对整个脚本文件进行一次通篇扫描,主要目的是检查代码中是否存在语法错误。
1.2 预编译
1.2.1 函数声明整体提升
对于函数声明,无论其定义在代码中的哪个位置,JavaScript引擎都会将其整个定义提升到当前作用域的最顶端。
1.2.2 变量声明提升
变量声明仅将声明语句提升至作用域顶部,而赋值操作保留在原位。因此,在声明但未赋值的阶段访问该变量,其值为undefined,这种现象被称为声明提升。
document.write(a);
var a=123;
1.2.3 暗示全局变量
1. 定义:如果变量在赋值时未使用var、let或const进行声明,该变量将自动成为全局对象(在浏览器环境中为window)的属性。
eg:a=10;
----------> window.a=10;

上述代码示例中,var声明了变量a,赋值过程从右向左进行:先将123赋给b,再赋给a。由于b未显式声明,它变成了全局变量,因此window.b的值为123;而a因被var声明且未赋值,其值为undefined。
2. 所有通过声明方式定义的全局变量,均作为window(全局作用域)对象的属性存在。
1.2.4 预编译四部曲(预编译发生在函数执行的前一刻)
1. 创建AO对象(Activation Object,活跃对象/作用域=执行器上下文),全局变量则属于GO(global object,即window)。
2. 查找形参和变量声明,将变量名和形参名作为AO的属性名,并初始化为undefined。
3. 将实参的值与形参统一(此步骤仅针对函数调用,全局作用域无此步骤)。
4. 在函数体内查找函数声明,将函数体作为该属性名的值。
例1:

建立函数

预编译阶段已处理过的内容,在函数实际执行时不再重复处理。以下是函数执行后的结果。

例2:

函数执行完毕后,打印结果为 1,2,2。
例3:

直到函数执行结束,变量a的值才被更新为10。
例4:


1.3 解释执行
JavaScript是单线程语言,采用解释一行执行一行的方式运行代码。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注本站的更多内容!
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
