预编译 优先级: 函数声明>实参>形参
预编译阶段就是作用域的创建阶段(分为全局作用域和函数作用域)
js的变量对象在函数作用域创建阶段也叫 AO对象 (是我们访问不到的,是供js引擎访问的)
AO对象在函数作用域创建阶段坐了哪些事情?(预编译阶段,不包括预编译执行完成后的js解释阶段(比如具体变量赋值))
1、创建AO对象
2、找形参和变量声明 来作为oa对象的属性,值为undefined;
3、实参和形参相统一
4、找函数声明,并且函数声明的名称和变量的名称一致,函数声明会覆盖变量声明(此变量声明指实参赋值的变量声明)
切记预编译阶段止步于第四步找函数声明并覆盖变量声明。在之后的js解释执行代码阶段,实际值还要看变量赋值的上下文中变量赋值的具体位置;
再看下图 也有清晰的注释: