javascript範圍問題

來源:互聯網
上載者:User

標籤:

 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範圍問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.