每日一学(一)
以下兩段代碼各自的輸出結果是什么,為什么。
//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
轉載于:https://www.cnblogs.com/sunshine-wy/p/9212476.html
總結
- 上一篇: BZOJ 2134: 单选错位
- 下一篇: html5-6 Frame框架窗口类型