Javascript是一段一段執行的,以script標簽來分割,執行每一段之前,都有一個“預編譯”, 預編譯干的活有兩:1.聲明所有var變量(初始為undefined),2.解析定義式函數語句。
有個關于 “window作用域下,a = 1和var a = 1” 的區別的很經典:
a = 1相當于window.a = 1,是動態地為window添加一個成員; var a = 1是在當前作用域(也就是window)下聲明一個a,這個聲明是在整個作用域內都有效的。 換句話說,其實區別就在于var a = 1比a = 1多了一個聲明的行為。
看看下面的例子:
1.
alert(w); alert('ok'); w = 2;
報錯:w is not defined
2.
alert(w); alert('ok');var w = 2;
依次彈出undefined和ok。預編譯的時候,聲明了變量w;執行到alert(w)這行代碼的時候,t尚未被賦值,所以彈出undefined。
3.
a();function a() {}alert('ok');
彈出ok。預編譯的時候,解析了定義式函數語句function a() {},順利執行。
4.
b();var b = function() {}; alert('ok');
b不是函數,執行報錯。預編譯的時候,聲明了變量b = undefined;執行到b()時,a還等于undefined,不是函數,所以執行b()會報錯。
5.
<script type="text/javascript"> c(); alert('first');</script><script type="text/javascript"> alert('second');</script>
彈出second。因為javascript是一段一段執行的,第一段執行到c()的時候報錯,整個第一段都不會再執行,第二段正常執行。
相關推薦:
Javascript執行順序分析
Javascript執行順序的簡單介紹
詳解js在html中的加載執行順序
以上就是js編譯和執行順序詳解的詳細內容,更多請關注php中文網其它相關文章!