1.沒搞懂js的執行順序,執行下面程式碼,剛開始alert的時候,a還沒有聲明,不是應該直接報錯嗎?為什麼先是顯示這個function,然後顯示10,顯示3,最後還報錯了?不是一開始就該報錯了嗎?
alert(a) a(); var a=3; function a(){ alert(10) } alert(a) a=6; a()
問了下同學,知道了為什麼會出現那樣的情況,首先要明白的概念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都不是函數,所以報錯了。
var a=3;
a=6;
第一個輸出 function 是因為作用域提升(hoisting)。 第二個輸出 10 是第二行 a() 的輸出。 第三個輸出 3 是倒數第三行 alert(a) 的輸出。 最後一個報錯是來自最後一行 a()。因為這時候 a 被重新賦值為數字 6,已經不是 function 了。執行 a() 當然會報錯。
function
a()
alert(a)
a
6
變數宣告提升麼,記住下面幾條規則就好了。
http://zonxin.github.io/post/...
問了下同學,知道了為什麼會出現那樣的情況,首先要明白的概念
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都不是函數,所以報錯了。第一個輸出
function
是因為作用域提升(hoisting)。第二個輸出 10 是第二行
a()
的輸出。第三個輸出 3 是倒數第三行
alert(a)
的輸出。最後一個報錯是來自最後一行
a()
。因為這時候a
被重新賦值為數字6
,已經不是function
了。執行a()
當然會報錯。變數宣告提升麼,記住下面幾條規則就好了。
http://zonxin.github.io/post/...