繼續做用域的問題,今天上午看了一會,下午看又看到了一個類型的題,函數名和變量名相同的問題。以前還不會以爲函數名和變量名重名了會有什麼衝突。也是沒有去測試過。。懶了。直接貼代碼:函數
運行以後你們猜想結果是多少?一口氣:100!!我果真是好大的口氣,沒有思考直接給出答案,實在是不太好的習慣。測試
出乎意料的報錯了,有點一頭霧水的感受。可是一步一步的去分析的話,仍是能夠明白爲何會是這個答案。blog
首先這道題須要和JS的預編譯階段掛鉤了,也就是在執行代碼以前,須要準備的上下文環境;在預編譯階段要準備須要使用到的變量、函數等資源。資源
變量和變量表達式在預編譯階段獲得的是聲明,而沒有賦值,獲得undefined;作用域
聲明式函數在預編譯階段獲得的是賦值,沒錯,就是直接賦值。編譯
而且準備資源的順序是有前後的,先預編譯 參數 > 函數 > 變量;變量
那麼這道題能夠解析爲:im
這個時候就能夠很好的理解爲何 a() 這個結果是報錯說a不是一個function了,人家原本就已經不是function了,已經從新定義賦值爲值類型了,固然要報錯咯。img