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 @   howhy  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
历史上的今天:
2021-01-06 eslint stander js代码规范
点击右上角即可分享
微信分享提示