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;
        }

 

posted @ 2022-01-06 11:39  howhy  阅读(67)  评论(0编辑  收藏  举报