JavaScript运行原理详解:语法分析、预编译与解释执行

作者:闭包旅人

时间:2026-10-24

浏览:549

本文详细解析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;

1.1 语法分析

上述代码示例中,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:

1.1 语法分析

建立函数

1.1 语法分析

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

1.1 语法分析

例2:

1.1 语法分析

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

例3:

1.1 语法分析

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

例4:

1.1 语法分析

1.1 语法分析

1.3 解释执行

JavaScript是单线程语言,采用解释一行执行一行的方式运行代码。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注本站的更多内容!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章