最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過示例演示理解javascript預解析

 更新時間:2022年03月14日 15:36:45   作者:館主阿牛  
這篇文章主要為大家介紹了通過示例演示理解javascript預解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

面試官最愛考的javascript預解析,你搞明白了嗎?javascript的es5語法和其他語言還是有些區(qū)別的,預解析正是面試愛考的重點,不妨來看看這篇博文…

提出問題

先看下面的兩個最基本問題,結果你想到了嗎?

坑一

<script>
    // 坑一
    console.log(num);
    var num = 10;
</script>

在這里插入圖片描述

結果為什么會是undefined呢?先保留這個疑問,后面解答,嘿嘿嘿~~~

坑二

下面這種函數定義方式,函數的調用在函數前后都可以

// 下面這種函數定義方式,函數的調用在函數前后都可以
        fn();
        function fn(){
            console.log(15);
        }
        //fn();

在這里插入圖片描述

那么我們再看看javascript中的另一種函數定義(函數表達式)是否和上面的一樣呢?

// 下面這種函數定義方式,函數的調用只能在函數后面
        fun();
        var fun = function(){
            console.log(15);
        }
        // fun();

在這里插入圖片描述

這種函數定義,函數的調用放在函數前面為什么又會報錯了呢,帶著疑問我們看下面的解答。

問題解答

要了解上面兩個坑的原因,我們就要知道javascript中的預解析。

1.我們 js 引擎運行 js 分為兩步:預解析和代碼執(zhí)行。

  • (1).預解析 :js 引擎會把 js 里面所有的 var 還有 function 提升到當前作用域的最前面
  • (2).代碼執(zhí)行:按照代碼書寫的順序從上往下執(zhí)行。

2.預解析分為變量預解析(變量提升)和函數預解析(函數提升)。

  • (1).變量提升就是把所有的變量聲明提升到當前的作用域最前面,不提升賦值操作。
  • (2).函數提升就是把所有的函數聲明提升到當前作用于的最前面。

看了上述,是不是對于上面的疑惑解決了,還是懵懵懂懂嗎?下面我來復現一下你就明白了。

// // 坑一
        // console.log(num);
        // var num = 10;
        // 相當于執(zhí)行了以下代碼
        var num; // 所有的 var 提升到當前作用域的最前面,不提升賦值操作。
        console.log(num); //num此時未賦值,所以是undefined。
        num = 10;
// // 坑二
// 下面這種函數定義方式,函數的調用在函數前后都可以
        // fn();
        // function fn(){
        //     console.log(15);
        // }
        // 相當于執(zhí)行下面代碼
        // 函數提升到當前作用域的最前面
        function fn(){
            console.log(15);
        }
        fun();
// 下面這種函數定義方式,函數的調用只能在函數后面
        // fun();
        // var fun = function(){
        //     console.log(15);
        // }
        // 相當于執(zhí)行了以下代碼
        var fun;   // 所有的 var 提升到當前作用域的最前面,不提升賦值操作。
        fun(); // 此時壓根沒有fun()這個函數,所以會報錯
        fun = function(){
            console.log(15);
        }

現在是不是很清楚了。

案例練習

案例一

結果是幾?

 // 案例一
        var num=10;
        fun();
        function fun(){
            console.log(num);
            var num = 20;
        }
        // 相當于執(zhí)行了以下代碼
        // var num;

        // function fun(){
        //     var num;
        //     console.log(num); //根據作用域鏈的就近原則,此時num未賦值,所以是undefined
        //     num = 20;
        // }
        // num = 10;
        // fun(); // 調用函數

在這里插入圖片描述

案例二

結果是幾?

// 案例二
        var num = 10;
        function fn(){
            console.log(num);
            var num = 20;
            console.log(num);
        }
        fn();
        // 相當于執(zhí)行了以下代碼
        // var num;
        // function fn(){
        //     var num;
        //     console.log(num);   //根據作用域鏈就近原則,此時num未賦值,所以是undefined
        //     num = 20;
        //     console.log(num);  // 根據作用域鏈就近原則,num是20
        // }
        // num = 10;
        // fn(); // 調用函數

在這里插入圖片描述

案例三

結果是幾?

// 案例三
        var a = 18;
        f1();
        function f1(){
            var b = 9;
            console.log(a);  
            console.log(b);
            var a = '123';
        }
        // // 相當于執(zhí)行了以下代碼
        // var a;
        // function f1() {
        //     var b;
        //     var a;
        //     b = 9;
        //     console.log(a);  //根據作用域鏈就近原則,此時a未賦值,所以是undefined
        //     console.log(b);  // 9
        //     a = '123';
        // }
        // a = 18;
        // f1();

在這里插入圖片描述

案例四(經典的面試題)

結果是幾?

 // 案例四
        f1();
        console.log(c);
        console.log(b);
        console.log(a);
        function f1(){
            var a = b = c = 9;
            // 相當于var a = 9; b = 9 ; c = 9 ; 在javascript中不用var申明直接賦值的變量是全局變量,所以b,c是全局變量
            // 區(qū)別于集體聲明 var a = 9,b = 9,c = 9; 等價于var a = 9,var b = 9,var c = 9;
            console.log(a);
            console.log(b);
            console.log(c);
        }
        // // 相當于執(zhí)行了以下代碼
        // function f1(){
        //     var a;
        //     b = 9;
        //     c = 9;
        //     a = 9;
        //     console.log(a); // 9
        //     console.log(b); // 9
        //     console.log(c); // 9
        // }
        // f1();  // 函數調用
        // console.log(c);  // 9
        // console.log(b);  // 9
        // console.log(a);  // a是函數里的局部變量,所以函數外沒有申明的話會報錯

在這里插入圖片描述

結語

看了這節(jié)內容,你掌握javascript中的預解析了嗎,面試再也不怕啦!??!

相關文章

最新評論

邛崃市| 米易县| 巫山县| 泰来县| 土默特左旗| 普定县| 年辖:市辖区| 西充县| 包头市| 射阳县| 宜川县| 微博| 桂阳县| 桦南县| 张家界市| 治县。| 元江| 遵义市| 府谷县| 合作市| 德兴市| 永宁县| 湘西| 建平县| 阜南县| 烟台市| 桐城市| 永嘉县| 梨树县| 聂荣县| 陇西县| 高平市| 荔波县| 海伦市| 宜州市| 上饶市| 乐都县| 龙岩市| 邢台市| 含山县| 海南省|