function fn(a,e){
console.log(a);
console.log(e);
var a = 123;
console.log(a);
console.log(c);
function a(){}
if(false){var d = 456}
console.log(d)
console.log(b)
var b = function (){}
console.log(b);
function c (){}
console.log(c);
}
fn(1,2)
function fn(a,e){
//变量提升,函数提升
var a; //预编译阶段被function a(){} 覆盖掉
var e;
function a(){}
var b;
var d;
function c(){}
e=2;
console.log(a); //function a(){}
console.log(e); //undefined
a=123;
console.log(a); //123
console.log(c); //function c(){}
if(false){var d = 456}
console.log(d); //undefined
console.log(b); //undefined
b = function(){}
console.log(b); //function(){}
console.log(c); //function c(){}
}fn(1,2)
预编译的四部曲:
1.创建GO/AO对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
AO={
a:undefined 1 function a(){},
b:undefined,
c:undefined function c(){},
d:undefined,
e:undefined 2,
}