javascript - js的執(zhí)行順序是怎樣的?
問題描述
1.沒弄懂js的執(zhí)行順序,執(zhí)行下面代碼,剛開始alert的時候,a還沒有聲明,不是應(yīng)該直接報錯嗎?為什么先是顯示這個function,然后顯示10,顯示3,最后還報錯了?不是一開始就應(yīng)該報錯了嗎?
alert(a)a();var a=3;function a(){alert(10)}alert(a)a=6;a()
問題解答
回答1:問了下同學(xué),知道了為什么會出現(xiàn)那樣的情況,首先要明白的概念1.js中,變量聲明和函數(shù)聲明是會提前的,并且函數(shù)聲明會優(yōu)于變量聲明。所以,在聲明a之前alert(a),并不會報錯。以及,第一個alert,出現(xiàn)的是a這個function,并不是變量a。2.第二個alert,無需多言,只是執(zhí)行a這個函數(shù)。3.第三個alert,結(jié)果是3,因為運(yùn)行到了這里之前,執(zhí)行了 var a=3;。所以a變成了3。4.最后報錯是因為,執(zhí)行到a();a進(jìn)行了兩次賦值,第一次是var a=3;,第二次是a=6;,但是無論怎樣,a都不是函數(shù),所以報錯了。
回答2:第一個輸出 function 是因為作用域提升(hoisting)。第二個輸出 10 是第二行 a() 的輸出。第三個輸出 3 是倒數(shù)第三行 alert(a) 的輸出。最后一個報錯是來自最后一行 a()。因為這時候 a 被重新賦值為數(shù)字 6,已經(jīng)不是 function 了。執(zhí)行 a() 當(dāng)然會報錯。
回答3:變量聲明提升么,記住下面幾條規(guī)則就好了。
http://zonxin.github.io/post/...
相關(guān)文章:
1. 查詢mysql數(shù)據(jù)庫中指定表指定日期的數(shù)據(jù)?有詳細(xì)2. mysql - 怎么生成這個sql表?3. mysql儲存json錯誤4. php - 公眾號文章底部的小程序二維碼如何統(tǒng)計?5. mysql - 表名稱前綴到底有啥用?6. mysql - 數(shù)據(jù)庫表中,兩個表互為外鍵參考如何解決7. Navicat for mysql 中以json格式儲存的數(shù)據(jù)存在大量反斜杠,如何去除?8. 在mybatis使用mysql的ON DUPLICATE KEY UPDATE語法實現(xiàn)存在即更新應(yīng)該使用哪個標(biāo)簽?9. mysql - 數(shù)據(jù)庫建字段,默認(rèn)值空和empty string有什么區(qū)別 11010. sql語句 - 如何在mysql中批量添加用戶?
