东子个人博客

浅析JS预编译-函数篇

  1. 1. 前言
  2. 2. 正文
    1. 2.1. 何为预编译?
    2. 2.2. 示例代码
    3. 2.3. 预编译过程
    4. 2.4. 代码详解
  3. 3. 后记

前言

说起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了。
想的对不对呢,打开浏览器看看:
浏览器控制台输出
经验证,是这个理。

后记

以上就是对函数这一块预编译的介绍,欢迎大家评论区讨论、指正。