js原型轉載一

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');
= 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.

  1. 彈出second block。由於JS是一段一段執行的,第一段執行到a()的時候報錯,整個第一段都不會再執行,第二段正常執行。

firefox下的還有個小技巧:

若是上述例子中該報錯的沒有報錯,輸入about:config, 搜索strict, 看下javascript.options.strict, 若是是false的把他改成true。

相關文章
相關標籤/搜索