javascript - js的執行順序是怎樣的?
問題描述
1.沒弄懂js的執行順序,執行下面代碼,剛開始alert的時候,a還沒有聲明,不是應該直接報錯嗎?為什么先是顯示這個function,然后顯示10,顯示3,最后還報錯了?不是一開始就應該報錯了嗎?
alert(a)a();var a=3;function a(){alert(10)}alert(a)a=6;a()
問題解答
回答1:問了下同學,知道了為什么會出現那樣的情況,首先要明白的概念1.js中,變量聲明和函數聲明是會提前的,并且函數聲明會優于變量聲明。所以,在聲明a之前alert(a),并不會報錯。以及,第一個alert,出現的是a這個function,并不是變量a。2.第二個alert,無需多言,只是執行a這個函數。3.第三個alert,結果是3,因為運行到了這里之前,執行了 var a=3;。所以a變成了3。4.最后報錯是因為,執行到a();a進行了兩次賦值,第一次是var a=3;,第二次是a=6;,但是無論怎樣,a都不是函數,所以報錯了。
回答2:第一個輸出 function 是因為作用域提升(hoisting)。第二個輸出 10 是第二行 a() 的輸出。第三個輸出 3 是倒數第三行 alert(a) 的輸出。最后一個報錯是來自最后一行 a()。因為這時候 a 被重新賦值為數字 6,已經不是 function 了。執行 a() 當然會報錯。
回答3:變量聲明提升么,記住下面幾條規則就好了。
http://zonxin.github.io/post/...
相關文章:
1. mysql - 如何減少使用或者不用LEFT JOIN查詢?2. mysql - jdbc的問題3. Python爬蟲如何爬取span和span中間的內容并分別存入字典里?4. python - 我在使用pip install -r requirements.txt下載時,為什么部分能下載,部分不能下載5. 視頻文件不能播放,怎么辦?6. python - Scrapy存在內存泄漏的問題。7. html5 - H5 audio 微信端 在IOS上不能播放音樂8. mysql - 分庫分表、分區、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處9. python - 編碼問題求助10. mysql - 千萬級數據的表,添加unique約束,insert會不會很慢?
