js预编译

预编译前奏

1.imply global暗示全局变量,如果变量未经申明就赋值,此变量就为全局变量所有

 function fun(){
            a=20
        }
        fun();
        console.log(a)/*a为20*/

2.一切声明的全局变量,全是window的属性。

即var a=10等于window.a

 var a=10;
        var b=20;
        var c=30;
        console.log(window)

3.预编译发生在函数声明的前一刻

预编译主要分为两种

全局(相当于只要局部的2,4部分):

全局是script标签中的代码,不包括函数执行

1.生成一个GO对象找声明变量,变量名为属性名,值为undefined;

2.找函数声明,函数名为属性名,值为函数体,如果函数名和变量名一样则无情覆盖

函数内部(局部):

1创建AO对象

2找形参和变量声明,将形参和变量名作为AO的属性名,值为undefined

3.将实参和形参统一------也就是将实参的值赋给形参

4找函数声明,函数名为属性名,值为函数体,如果函数名和变量名一样则无情覆盖

全局实例:

<script type="text/javascript">
        console.log(a)
        var a=10;
        console.log(a)
        function a(){}
        console.log(a)
        </script>

1.创建GO对象:

GO{

a:undefined

}

2.找函数声明,函数名为属性名,值为函数体,如果函数名和变量名一样则无情覆盖:

GO{

a:function a(){}

}

3.逐行执行:

函数内部实例:

<script type="text/javascript">
        function fn(a){
            console.log(a);
            var a = 123;
            console.log(a);
            function a(){}
            console.log(a);
            var b = function(){}
            console.log(b);
            function d(){}
        }
        fn(1);
        </script>

1.创建AO对象(执行上下文):

AO{

}

2.找形参和变量声明,将将形参和变量名作为AO的属性名,值为undefined:

AO{

a:undefined

b:undefined

}

3.将实参和形参统一------也就是将实参的值赋给形参:

AO{

a:1

b:undefined

}

4.找函数声明,函数名为属性名,值为函数体,如果函数名和变量名一样则无情覆盖

AO{

a:function a(){}

b:  undefined

}

5.然后逐行执行:

原文地址:https://www.cnblogs.com/xuhanghang/p/10146258.html