前言
说起javascript吧,我只能算是会写一些基础的代码,之前没细致探索过预编译啊、作用域啊。这几天在B站上又细致的看了些这方面内容,特做个笔记,如有错误,欢迎评论指正。
正文
何为预编译?
我们都知道,js是解释型语言,它是看一行执行一行,但在执行前会进行预编译。预编译主要进行变量的声明提示和函数的整体提升。本文将主要介绍执行函数这一块,全局也是差不多一样道理。
示例代码

这是一段代码,里面涉及到控制台输出,小伙伴们可以先判断判断console.log这几处会输出什么。
预编译过程
就函数而言,预编译发生在函数执行的前一刻进行。
- 首先,会创建AO对象。官方名叫运行期上下文对象好像。
- 接着,会找函数里的形参和变量名,并在AO对象中赋值为undefined。
- 然后,形参和实参相统一。即将实参赋值给对应的形参。
- 最后,会找函数里的函数声明,并在AO对象中把函数体赋值给它。
代码详解
首先,在函数执行前一刻创建了AO对象。
然后,我们发现这个函数没有形参,但声明了变量a和变量b,此时的AO对象为:
AO:{
a:undefined,
b:undefined,
}
没有形参和实参这一步,我们来到最后一步,发现有个函数声明即function b(){},到这,AO对象变为:
AO:{
a:undefined,
b:function b(){ ... }
}
预编译到这里就结束了。
开始运行函数,那么第一行输出不言而喻,是undefined。下一行var b这一块就可以忽略,因为已经做过预编译了。
下一行不言而喻,是function b(){}。然后接着,a=20,b=30。那么AO对象里也这样变化:
AO:{
a:20,
b:30
}
最后两个输出就分别是20和30了。
想的对不对呢,打开浏览器看看:
经验证,是这个理。
后记
以上就是对函数这一块预编译的介绍,欢迎大家评论区讨论、指正。