0
点赞
收藏
分享

微信扫一扫

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)//12
c=0
var c
a=3
b=2
console.log(b) //2
function b(){}
function d(){}
console.log(b) //2
}
test(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;
}

 


举报

相关推荐

0 条评论