javascript深度剖析之 【 var 關鍵字】。


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的關鍵字的一些特性,如有錯誤或遺漏之處。歡迎指出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM