javascript中使用var定義變數的先行編譯效果
首先說明一點:javascript文法是非常靈活的,靈活的代價就是很容易導致不規範的編碼和各種意想不到的運行結果。ECMAScript 5 引入了 嚴格模式 (strict mode),今後我們編寫javascript代碼最好都使用"use strict",規範我們的javascript代碼。下面的測試代碼不是基於嚴格模式。
alert(a);var a;//已聲明未賦值alert(b);//未聲明的變數
執行結果是:a列印undefined,b報錯。這說明:var a;這條語句的執行在alert(a)之前。
alert(c);var c = 1;alert(c);
執行結果:先列印undefined,後列印1。實際上只是把聲明提前了,但是賦值語句仍然沒有改變位置
alert(a);a = 1;
執行結果:代碼報錯。可見沒有var關鍵字,變數的聲明不會提前,沒有”先行編譯”的過程。
function TestClass() { //沒有使用var關鍵字定義的是全域變數 val = 1; alert(val); //全域變數會存放在window對象中 alert(window.val);};//調用TestClass建構函式test = new TestClass();//再次驗證是一個全域變數alert(val);
沒有用var,其實是定義了一個全域變數,會放在window對象中。
function TestClass() { val = 1; alert(val);//1 alert(window.val);//undefined var val = 10; alert(val);//10 alert(window.val);//undefined}var test = new TestClass();alert(val);//js報錯,變數為定義
由此可見:使用var定義變數,變數聲明會被提前,但是賦值不會提前.