使用var和不使用var宣告變數的區別

admin發表於2017-03-28

在介紹之前首先說明一點,在嚴格模式下,不使用var宣告變數將會報錯,所以最好在任何時候宣告變數都要使用var關鍵字。

非嚴格模式或者非新的js版本中,宣告一個變數var關鍵字不是必須的,下面就介紹一下使用var和不使用var之間的區別。

先看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
function func(){  
  var url="http://www.softwhy.com";
  webName="螞蟻部落";
}
func();
//console.log(url)會報錯
console.log(webName);

在函式作用域內,使用var宣告的變數只能夠在此函式作用域內使用,而不用var宣告的變數,可以在全域性範圍內使用。

再來看一段程式碼:

[JavaScript] 純文字檢視 複製程式碼
var url="http://www.softwhy.com";
webName="螞蟻部落";
console.log(window.url);
console.log(window.webName);

在全域性作用域宣告的變數,無論加不加var都是作為全域性物件的一個屬性,但這並不說明它們兩者沒有區別,看如下程式碼:

[JavaScript] 純文字檢視 複製程式碼
var url="http://www.softwhy.com";
webName="螞蟻部落";
 
var urlTx=Object.getOwnPropertyDescriptor(window,'url')
var webNameTx=Object.getOwnPropertyDescriptor(window,'webName')
 
for(var propUrlTx in urlTx){
  console.log(propUrlTx+":"+urlTx[propUrlTx] );
}
 
for(var propWebNameTx in webNameTx){
  console.log(propWebNameTx+":"+webNameTx[propWebNameTx]);
}

從上面程式碼的輸出值來看,兩者還是有區別的,兩個屬性的configurable特性值是不同的,帶var的是false,不帶var的是true。configurable決定了一個屬性是否可以被delete運算子刪除,如果是false就不能刪除,如果為true則能夠被刪除,看如下程式碼:

[JavaScript] 純文字檢視 複製程式碼
var url="http://www.softwhy.com";
webName="螞蟻部落";
 
delete window.url;
delete window.webName;
 
console.log(window.url);
console.log(window.webName);

關於Object.getOwnPropertyDescriptor()參閱Object.getOwnPropertyDescriptor()一章節。

相關文章