標籤:
1 function TestClass() { 2 //定義一個全域變數 3 val = 1; 4 alert(val); 5 alert(window.val); 6 //我僅僅是添加了以下代碼 7 //var val = 10; 8 } 9 //調用TestClass函數10 test = new TestClass();11 alert(val);
第三行定義一個不帶var的全域變數,既然是全域變數,那麼這個變數就會變成window對象的一個屬性,所以第5、10行都輸出10,這沒有異議。但是看如下代碼:
1 function TestClass() { 2 //定義一個全域變數? 3 val = 1; 4 alert(val); 5 alert(window.val); 6 var val = 10; 7 } 8 //調用TestClass建構函式 9 test = new TestClass();10 alert(val);
第一個alert輸出undefined,第二個報錯,這是為什麼呢?我就是僅僅加了一行 var val = 10; 這是因為:
其實javascript作為一個指令碼語言也是有所謂的先行編譯的,所有以var聲明的變數,var無論放在哪個部分都會放到範圍開頭來定義,上面的效果其實等同於:
1 function TestClass() {2 var val;3 val = 1;4 alert(val);5 alert(window.val);6 val = 10;7 }
這樣一來,val就變成了一個局部變數。那為什麼第一個會變成undefined,而第二個會文法報錯呢?這是因為這兩種寫法還是有區別滴:第一種寫法,window.val,這種寫法,如果存在val屬性,則取之;如果不存在則添加一個這樣的屬性,因為沒有初始化,所以為undefined;第二種寫法 alert(val); val沒有聲明就使用,這會報一個語法錯誤的。至此,已經解釋清楚了。
其實javascript是沒有塊級範圍的,倒是有函數範圍,請看下面例子:
1 function t(){2 for(var i = 0; i<4;i++){3 4 }5 alert(i);6 }7 alert(i);
第一個alert可以輸出4,第二個則報語法錯誤,證實了我上面的說法,具體可以參考《Javascript權威指南》。
javascript範圍問題