javascript中的var關鍵字,作用很簡單。用於聲明一個變數。如果不給聲明的變數賦值則為undefined.
var test = 'test'; var t;
此時test值為,'test', t 的值為undefinde.
似乎很簡單,並沒有什麼特殊的地方。只要學過js的,都知道。
那麼請看下面這段代碼的執行結果。
console.log(test);var test = 'test';console.log(test);
這樣先輸出了undefunde 然後輸出了test。很奇怪吧。相信很多朋友會以為會產生錯誤。
因為我們在輸出test時,它還未被定義。結果應該像輸出一個未定義的變數那樣被拋出錯誤才對。可是事實卻並非如此。
這是為什麼呢,原來JS在解析時var 會被預先解析。也就是說,這段代碼的實際運行效果是這樣的。
var test;console.log(test);test = 'test';console.log(test);
這樣一來就清晰多了吧,相信大家應該都能看明白。
接下來我們看一個複雜點的。
var test = 'test';console.log(test); //1function fn(){ console.log(test);//2 var test = 'function test'; console.log(test);//3}fn();console.log(test); //4
上面這段代碼,會依次輸出。
1.test
2.undefined
3.function test
4.test
相信這個大家都明白,原理與上面一樣。
函數內部被解析為
var test; //定義test console.log(test); //輸出test,值為undefined,因為當前環境記憶體在test,不在範圍鏈中向上尋找test, 故此輸出undefinedtest = 'function test'; // 給test賦值為 'function test'.console.log(test); //輸出test ,值為function test;
我們在看一個例子
console.log(test);var test = 'test';function test(){}console.log(test);
函數與變數同名的情況,當然。這種情況實際開發中幾乎不會遇到。
上面這個例子會輸出 function test(){} 然後輸出 'test', 原因是因為funciton會比var先解析。
而在javascript中,函數是對象,函數名卻是一個變數(變數裡儲存的是函數的引用)。
所以在在遇到第一次輸出test時,輸出的不是undefined 而是將函數輸出。
後面的執行過程大家應該都清楚了。
我們最後在看一個例子,
function fn(){ test = 'bbb'; var test = 'ccc'; console.log(test);}fn();console.log(test);
按照正常思路,似乎會輸出ccc,然後輸出bbb。因為test 前面沒有var 此時它代表全域變數。
然而很不幸的是,會先輸出'ccc'然後拋出一個錯誤.原因是test不存在。
原因是什麼呢,很簡單。因為fn內部解析過程是這樣的。
var test;test = 'bbb';test = 'ccc';
故此test = bbb 實際是對函數內部的test 進行操作。
由此上例子我們可以的到一個結論,在js中調用可以在定義前面的,不止是function;變數也可以,見下例;
function fn(){ test = 'ttt';
alert(test);
return;
var test; //此定義會被解析到指派陳述式之前,故此上面的test 是函數內部變數。}
此時的test依舊是函數內部變數。
以上便是var的關鍵字的一些特性,如有錯誤或遺漏之處。歡迎指出。