每日一學(一)

    以下兩段代碼各自的輸出結果是什麼,爲什麼。

    

    //1.
    var a="window";
    function Test(){
        console.log(a);
        var a="local";
        console.log(a);
    }
    Test();
    
    //2.
    var pengpeng="This is his code!";
    pengpeng.love="study";
    console.log(pengpeng);
    console.log(pengpeng.love); 

    

    先說第一個,最後的輸出結果首先輸出undefined,然後輸出local。有些神奇有木有,仔細梳理就會發現端倪了,代碼首先定義了一個全局對象a,因此按理說執行Test第一行代碼的時候,a此時應該會使用全局對象a的,往下的時候,局部a會覆蓋全局a,然後接着輸出local,但實際結果第一個卻是undefined。

    關於這點,不得不提JS的加載邏輯了,很多人會覺得JS變量的定義和聲明,是在JS運行期間進行的,其實不是,JS有個預加載邏輯,會事先構造運行環境以及作用域,那麼答案就呼之欲出了,上面第一段代碼,JS預加載的時候,局部變量a覆蓋了全局變量a,那麼既然是局部已經優先覆蓋了全局a,爲什麼第一個a還是undefined呢? 這就不得不提作用域了,預加載的時候,全局a的作用域已經變成了局部a,所以一個輸出的時候,根據作用域找a的時候,其實是找不到這個a的,此時的a,僅僅只是被定義過,但是它的作用鏈上,是指向下面的a的,下面的a在運行到那裏的時候纔會被賦值,而此時a相當於未賦值,所以輸出undefined,如果不是全局定義了一下a,第一次輸出a會報未定義。

    總結一下第一個案例的原理,JS預加載的時候,局部變量改變了全局變量的作用域,在局部變量之前訪問全局變量時,此時值是undefined。

    


      再說第二個,這個不細心一下會被“障眼法”遮住,爲啥給賦值了,第二個居然仍然輸出undefined?? ——答案是,變量pengpeng只是一個值類型對象,而非引用類型對象,值類型是沒有屬性的, 只有引用類型纔有。so,penglong.love肯定會輸出undefined了。

    如果要用屬性,得這麼用:

    

    //3.
    var dingman=new Object();
    dingman.love="study";
    console.log(dingman.love);

    

    以上知識點出處:https://www.cnblogs.com/sharpxiajun/p/4133462.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章