关于js代码编译的那些你不知道的事

99 阅读1分钟

首先我们都知道

v8引擎读取到代码时,先编译再运行 。

js代码被编译时,声明部分会提升到当前作用域的顶部,赋值语句不提升

f929ce05222340e19661e7f9f94c152c~tplv-73owjymdk6-jj-mark-v1_0_0_0_0_5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3OTM1NDY5MzIxNjAwMA==_q75.jpg

但是当一个代码中含有多个函数体以及变量声明时 ,仅靠声明部分提升到作用域顶部是完成不了代码编译分析的,如下图所示,这时候我们就要引入函数体编译这个新规则

屏幕截图 2025-11-06 084502.png 函数体编译的规则如下

1.创建函数的执行上下文 AO对象

2.找形参和变量声明,将形参和变量声明作为AO的属性名,值为undefined

3.将实参和形参统一

4.在函数体内找函数声明,函数名作为AO的属性名,值为函数体

这时候分析这段代码就会非常简单了

屏幕截图 2025-11-06 090216.png

编译完在分析执行语句轻松得到答案

屏幕截图 2025-11-06 090412.png

屏幕截图 2025-11-06 090510.png

这时候再加上全局编译的规则

当全局被编译时

1.创建全局执行上下文GO对象

2.找变量声明,将变量名作为GO的属性,值为undefined

3.找函数体声明,函数名为GO的属性,值为函数体

一段再繁琐的代码也能轻松拿下

屏幕前的友友们快来试试吧

屏幕截图 2025-11-06 091131.png