前言:javascript裡變量作用域是個經常讓人頭痛抓狂的問題,下面通過10++個題目,對經常遇到又容易出錯的情況進行了簡單總結,代碼樣例很短很簡單
解釋:在函數show中,name是個局部變量,題目三的原理同樣适用于此,即函數show内部實際為
(小知識點補充:當函數内部存在與外部全局變量同名的局部變量,優先使用局部變量,此處為name)
解釋:javascript沒有塊級作用域(即由{}限定的作用域),函數中聲明的所有變量,無論在哪裡聲明,在整個函數中都是有定義的,這點跟c++等灰常不同,趕緊扭轉思想與時俱進
于是,再來看下show方法實際的内部解析邏輯
解釋:javascript代碼解析的過程,類似 function show() 這種形式聲明的函數,跟var聲明的變量一樣,都會被提到最前面,不同的是,函數聲明跟定義同時完成,但var聲明的變量的指派在後面才會完成
解釋:采用函數定義式以及函數表達式定義函數,兩者過程之間存在一些差別
函數定義式:function show(){}
函數表達式:var show = function(){}
采用函數定義式聲明的方法,函數的定義會提前;而采用函數表達式聲明的方法,函數的定義,跟采用var聲明的局部變量一樣,函數聲明會提前,但函數定義位置不變,過程如下:
是不是有砸顯示器的沖動。。。data此時其實為{name:'casper'},把一個object當函數調用,于是報錯了
前面說過,函數聲明(通過函數定義式)、var聲明的變量會被提前,但是會有先後順序之分,如下:
略微修改下,結果就不同鳥:
結合上文不難猜想過程如下:
小結:javascript作用域的問題着實令人頭疼,作為基礎中的基礎,把它搞清楚還是很有必要的,上面列舉
了不少容易出錯的場景,但實際情況可能比這還複雜,閉包、this、不同段之間的腳本(即腳本分散寫在多段<script>标簽中)等這裡就
不展開了。以上内容如有錯漏 或 講解不當之處,歡迎指出。
背景:昨晚被某兄弟某了一道關于變量作用域的問題,灰常自信地給出答案,然後。。。乖乖回去翻下犀牛書好生重溫了一遍,以下僅做備忘,過幾天再來看下自己還能不能正确看出答案。。。