预解析

预解析:

//函数调用的时候,会把函数的声明提升到作用域的上面
f1();//调用
var num = 20;//这个变量的声明会提升到变量使用之前
function  f1() {
    console.log(num);
}

//他真正的执行顺序:
var num;
function  f1() {
    console.log(num);
}
f1();
var num = 20; 

故结果就是:undefined
<script>
        //函数调用的时候,会把函数的声明提升到作用域的上面
        // f1();//调用
        // var num = 20;//这个变量的声明会提升到变量使用之前
        // function  f1() {
        // console.log(num);
        // }

        //----------------------------------------------
        /*
        * 预解析中,变量的提升只会在当前的作用域中提升,提升到当前的作用域的最上面
        * 函数中的变量只会提升到函数的作用域中的最前面,不会在外面取到
        * 预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)
        * 先提升var 再提升function
        * */
        
        // function f1() {
        // console.log(num);//undefined
        // var num = 10;
        // }
        // f1();
        // console.log(num);//结果会报错

        f1();
        function f1() {
            console.log("哈哈");
        }
    </script>
    <script>
        function f1() {
            console.log("嘎嘎");
        }
    </script>

<script>
        console.log(a);//预解析会将下面的两个声明都提前,先提前var,再提升function,那么当输出的时候,输出离console.log最近的一个
        function a() {
            console.log('aaaa');
        }
        var a=1;
        console.log(a);//输出结果为1

    </script>

隐式全局变量:

<script>
        function getStr() {
            str = "我爱小杰";//str为隐式全局变量,可以在函数外面拿到,但是要调用函数
        }
        getStr();
        console.log(str);
</script>
<script>
        f1();//两对script标签中函数重名没有冲突,预解析声明变量的提升,仅在当前的作用域中提升,最终姐夫哦为"哈哈"
        function f1() {
            console.log("哈哈");
        }
    </script>
    <script>
        function f1() {
            console.log("嘎嘎");
        }
    </script>
 <script>
        f1();
        var f1 = function () {
            console.log(a);
            var a=10;
        }

        //相当于变成这样
        var f1;
        f1();//报错,f1是变量,不可调用
        f1 = function () {
            console.log(a);
            var a=10;
        }
    </script>

猜你喜欢

转载自blog.csdn.net/Muse1727/article/details/81583615