JS是一段一段執行的(以<script>標籤來分割),執行每一段以前,都有一個「預編譯」,預編譯乾的活是:聲明全部var變量(初始爲undefined),解析定義式函數語句。
javascript
還有個關於 "window做用域下,a = 1和var a = 1" 的區別的也很經典:html
a = 1至關於window.a = 1,是動態地爲window添加一個成員;
var a = 1是在當前做用域(也就是window)下聲明一個a,這個聲明是在整個做用域內都有效的。
換句話說,其實區別就在於var a = 1比a = 1多了一個聲明的行爲。
java
再看幾個例子:函數
1.ui
alert(t);
alert('ok');
t = 2;spa
t未聲明,執行報錯。firefox
2.orm
alert(t);
alert('ok');
var t = 2;htm
彈出undefined和ok。預編譯的時候,聲明瞭變量t;執行到alert(t)這行代碼的時候,t還沒有被賦值,因此彈出undefined。blog
3.
a();
function a() {}
alert('ok');
彈出ok。預編譯的時候,解析了定義式函數語句function a() {},順利執行。
4.
a();
var a = function() {};
alert('ok');
a不是函數,執行報錯。預編譯的時候,聲明瞭變量a = undefined;執行到a()時,a還等於undefined,不是函數,因此執行a()會報錯。
5.
<script type="text/javascript">
a();
alert('first block');
</script>
<script type="text/javascript">
alert('second block');
</script>
6.
彈出second block。由於JS是一段一段執行的,第一段執行到a()的時候報錯,整個第一段都不會再執行,第二段正常執行。
firefox下的還有個小技巧:
若是上述例子中該報錯的沒有報錯,輸入about:config, 搜索strict, 看下javascript.options.strict, 若是是false的把他改成true。