# 预编译 ### 预编译类型 * 全局预编译 (GO) * 局部预编译 (AO) ### 预编译发生的时间点 * 全局预编译 发生在 整个页面加载完成 * 局部预编译 发生在 函数执行的前一刻 ### 预编译过程 * GO: 1.先找变量和函数声明 赋值为undefined 2.扫描执行后 变量赋值 3.寻找函数声明 并把函数体赋给函数 4.执行 * AO 1.先找变量和形参 2.实参和形参相统一 3.寻找函数声明 并把函数体赋给函数 4.执行 函数表达式会在实参和形参相统一的步骤中完成赋值 ``` function a (val) { var name = val // c=0 这里的c是全局变量 window.c 能访问到 function b () {} var d=function(){} //d是一个函数表达式 } var str = 'Hello World' a(1) ``` 分析: GO: 1.找变量和函数声明 (a,str) 并赋值为Undefined Go{ a:undefined, str:undefined } 2.执行的过程中 变量赋值 GO{ a:undefined str:"hello world" } 3.找函数声明 GO{ a:function(){} str:"hello world" } Ao: 1.先找变量和形参 AO{ val:undefined, name:undefined, d:undefined } 2.实参和形参相统一 AO{ val:1, name:1, d:function(){} } 3.寻找函数声明 并把函数体赋给函数 AO{ val:1, name:1, b:function(){}, d:function(){} }