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); //1 function 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, 故此輸出undefined test = '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的關鍵字的一些特性,如有錯誤或遺漏之處。歡迎指出。