此时,b 的值已变为一个函数体。完成预编译公式后,GO 已完成定义。当预编译完成后,代码按顺序执行。此时执行第一行代码,因此 a 的值变为了 123。第三到第五行代码在 JS 执行时暂时忽略,因为它们在预编译时已提升。接着执行第七行代码,完成后执行第三到第五行代码。由于这些代码包含一个函数体,需要再次预编译,函数会产生一个 AO,并继承父函数作用域下的所有内容。
函数 b 会产生一个 AO,在这个过程中,函数 b 的 AO 首先检查是否有形参(aa),还检测到定义了一个变量 c。完成预编译公式前两条后,形成下图所示内容。接下来执行预编译公式第三条:将实参值与形参统一。因此,aa 的值在执行函数 b 时变为 123。最后,在函数 b 内寻找函数声明。由于无函数声明,最终形成下图所示内容。
至此,函数 b 的预编译完成,后续步骤仅执行,如变量 c 的赋值,最终使 c 的值为 888。这展示了 JavaScript 执行流程和预编译原理。记住【预编译公式】。