JS---函數名和變量名重名


繼續作用域的問題,今天上午看了一會,下午看又看到了一個類型的題,函數名和變量名相同的問題。之前還不會覺得函數名和變量名重名了會有什么沖突。也是沒有去測試過。。懶了。直接貼代碼:

運行之后大家猜測結果是多少?一口氣:100!!我果然是好大的口氣,沒有思考直接給出答案,實在是不太好的習慣。

出乎意料的報錯了,有點一頭霧水的感覺。但是一步一步的去分析的話,還是可以明白為什么會是這個答案。

首先這道題需要和JS的預編譯階段掛鈎了,也就是在執行代碼之前,需要准備的上下文環境;在預編譯階段要准備需要使用到的變量、函數等資源。

變量和變量表達式在預編譯階段得到的是聲明,而沒有賦值,得到undefined;

聲明式函數在預編譯階段得到的是賦值,沒錯,就是直接賦值。

並且准備資源的順序是有先后的,先預編譯 參數  > 函數 > 變量;

到函數和變量的預解析:

1)函數聲明會置頂
2)變量聲明也會置頂
3)函數聲明比變量聲明更置頂:(函數在變量上面)
4)變量和賦值語句一起書寫,在js引擎解析時,會將其拆成聲明和賦值2部分,聲明置頂,賦值保留在原來位置
5)聲明過的變量不會重復聲明

 

那么這道題可以解析為:

這個時候就可以很好的理解為什么 a() 這個結果是報錯說a不是一個function了,人家本來就已經不是function了,已經重新定義賦值為值類型了,當然要報錯咯。

Evey life has it's roses and throns

 

 轉載:https://www.cnblogs.com/Trista-l/p/7382135.html

       https://www.cnblogs.com/bugda/p/6036282.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM