關於JavaScript變數聲明及其初始化的問題

來源:互聯網
上載者:User

我們知道,js變數應通過var來定義,例如:

var a;

這種定義方式只定義了變數名,但沒給初值。不過,js在編譯時間會自動賦予undefined初值。如果要給明確的初值可這樣定義:

var a = 123;

請看下面的代碼:

alert(a);var a = 123;

上面的代碼在var之前就用到了變數。一般我們認為這樣的程式會報錯,可是實際運行後我們發現程式並未報錯,而是alert輸出了undefined(undefined也是個值)。這是為什麼呢?

在回答這個問題之前,再看下面的代碼:

alert(a);a = 123;

這段代碼與上一段代碼的區別在於去掉了var關鍵字。可是運行後我們發現程式報錯了。這又是為什麼呢?

為回答這個問題,我們就必須瞭解js的一些內部機制。這篇教程說得非常細緻。

首先,我們知道js裡除了對象什麼也沒有。那麼上面的變數a又是什麼呢?其實,在<script>...</script>標籤下(不在函數裡)直接寫的var我們稱之為頂層變數,不過嚴格說來頂層變數不應該稱為變數,而是window對象的一個屬性。window對象在瀏覽器解析<script>...</script>標籤時會自動先尋找出通過var定義的變數,然後馬上作為window的一個屬性,並初始化為undefined。並且,即使如果我們在var定義時給了初值,window的這個新屬性仍然被初始化為undefined。

回過頭來看看前面的代碼:

alert(a);var a = 123;

這段代碼被解析後相當於這樣:

var a;alert(a);a = 123;

因此我們看出,alert輸出為undefined了。

再看看前面的另一段代碼:

alert(a);a = 123;

這段代碼被解析時並未發現有var關鍵字,因此執行到alert(a)時,就等於執行alert(window.a),而window對象尚沒有a屬性,當然就報錯了。

再次強調,請仔細閱讀這篇教程,您一定收穫不小。同時也請您把前後各章節都仔細閱讀,相信對您提高js有相當大的協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.