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()的時候報錯,整個第一段都不會再執行,第二段正常執行。
相關推薦:
以上是js編譯和執行順序詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!