js 预编译
变量声明提升
函数整体提升
函数体预编译步骤:1、创建AO对象
2、找形参和变量声明(不管变量声明是在if或for大括号号内只要是var xx),将变量和形参名作为AO属性名,值为undefined
3、将实参值和形参对应赋值
4、在函数体里面找函数声明,函数名为作为AO属性名,值为函数体
函数体预编译在函数执行之前执行
function fn(a){ console.log(a);//function a(){} var a=123; console.log(a) //123 function a(){}//此处是函数声明 console.log(a) //123 var b=function(){}//此处不是函数声明 不函数表达式 console.log(b) //function(){} function d(){} } fn(11) //1、创建AO对象 AO={ } 2、找形参和变量声明,将变量和形参名作为AO属性名,值为undefined AO={a:undefined ,b:undefined } //3、将实参值和形参对应赋值 AO={a:11 ,b:undefined } 在函数体里面找函数声明,函数名为作为AO属性名,值为函数体 AO={a:function a(){} ,b:undefined } //函数执行时 // 1、console.log(a); console.log(AO.a) 结果是function a(){} // 2、var a=123; AO={a:123 ,b:undefined } console.log(a)console.log(AO.a) 结果是123 // 3、function a(){}//此处是函数声明 已提升不用管 AO={a:123 ,b:undefined } console.log(a)console.log(AO.a) 结果是123 // 4、var b=function(){} //此处不是函数声明 不函数表达式AO={a:123 ,b:function(){} } console.log(b)console.log(AO.b) 结果是function(){} function test(a,b){ console.log(a)//1 c=0 var c a=3 b=2 console.log(b) //2 function b(){} function d(){} console.log(b) //2 } test(1,12) function test1(a,b){ console.log(a) //function a(){} console.log(b) //undefined var b=234 console.log(b) //234 a=123 console.log(a) //123 function a(){} var a b=234 var b=function(){} console.log(a) //123 console.log(b) //function(){} } test1(13)
//全局的预编译
1、创建GO对象(window) GO={ } 2、找变量声明(不管变量声明是在if或for大括号号内只要是var xx),将变量名作为GO属性名,值为undefined
3、找函数声明,函数名为作为GO属性名,值为函数体
console.log(a) //function a(){} var a=123 console.log(a) //123 function a(){} console.log(a) //123 //1、创建GO对象 GO={ } 2、找变量声明,将变量名作为GO属性名,值为undefined GO={a:undefined } //3、找函数声明,函数名为作为GO属性名,值为函数体 GO={a:function a(){} } //函数执行时 // 1、console.log(a); console.log(GO.a) 结果是function a(){} // 2、var a=123; GO={a:123 } console.log(a)console.log(GO.a) 结果是123 // 3、function a(){}//此处是函数声明 已提升不用管 GO={a:123 ,b:undefined } console.log(a)console.log(GO.a) 结果是123
function fn(){ console.log(b)//undefined if(a){ var b=100 } console.log(b)//undefined c=234 console.log(c)//234 } var a; fn() a=10 console.log(c)//234
//首先预编译 GO={ a: undefined} 然后执行到fn()时fn函数先预编译 AO={b:undefined} 再执行fn时
function fn(){ return foo; foo=10 function foo(){} var foo=11 } console.log(fn())//function foo(){} console.log(fn1())//11 function fn1(){ foo=10 function foo(){} var foo=11 return foo; }