js中的预编译

<script>
    /*
    1.创建AO对象
    2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined;
    3.将实参值和形参统一
    4.在函数体里面找函数声明,值赋予函数体
    //上面的是预编译过程,任何以var 声明的赋值语句都在以上四步之后执行,但要注意var 声明的变量会提升,输出基本是undefined
    */
    function fn(a){
        console.log(a)//走到了第四步(1)   function a()
        var a = 123;
        console.log(a)//四步走完后,执行函数体里的代码(2) 123
        function a(){};//属于第四步,会预编译提升(3)  
        console.log(a)//基于第三步的理由,这一步的执行与第二步一样(4) 123
        console.log(b)//undefined  变量表达式提升是var b;所以输出undefined(5)
        var b = function(){}
        console.log(b)//function b() (6)
        console.log(d)//function d() 理由同(1)(7)
        function d(){}
        console.log(d)//上面一行代码由于提升可忽略,输出同(7)
    }
    fn(1)
    //上面的代码并没有出现形参与实参统一的现象,是因为执行了预编译的第四步,如果将代码中的(3)删除,(1)的输出就是1
    </script>

如果觉得冗余或是漏洞请指正

猜你喜欢

转载自blog.csdn.net/qq_40277572/article/details/86287828