1. 程式人生 > >javascript 三種變數宣告方式var、let、const

javascript 三種變數宣告方式var、let、const

var

語法格式:

var a=2;

var宣告的變數具有如下幾個特徵:

1.變數提升:變數宣告無論出現在程式碼的任何位置,都會在任何程式碼執行之前處理。即可以先呼叫再宣告。 

(提升的是var  a而不是a=2)

2.函式提升:JavaScript會將全域性函式提升到<script.../>元素的頂部定義。也就是說,在同一個<script....../>元素內,JavaScript允許先呼叫函式,然後在後面再定義函式,後面執行時會自動將函式的宣告提到頂部,也就是呼叫它之前,這樣就相當於提前聲明瞭該函式。

3.作用域:var變數沒有塊作用域。像if語句,for迴圈語句,都不會建立一個新的作用域,而函式會建立新的作用域,

4.給一個非宣告變數賦值會隱式建立一個全域性變數(全域性object的一個屬性),而該全域性變數會自動新增全域性window物件的屬性。

5.如果不初始化,輸出undefined。

注:函式提升要比變數提升的優先順序要高一些,且不會被變數宣告覆蓋,但是會被變數賦值之後覆蓋。

let

 引入let的原因正是var的侷限性,相比於var,let有以下幾點優勢:

1.作用域

let允許宣告一個作用域被限制在塊級中的變數、語句或者表示式。使用let定義的變數要等到程式流執行到定義變數的程式碼行時才會裝載。

<script type="text/javascript">
var name = 'yeeku'
function func()
{
	// 下面的name不存在,因此程式導致錯誤
	console.log(name);
	let name = 'fkit';
	console.log(name);
}
func();
</script>

 上面程式先定義了一個全域性的name變數,接下來程式在fun()函式中使用了let定義了同名的name變數,此時區域性變數name會覆蓋全域性的name變數。但由於let定義的變數不會提前裝載,因此在使用let定義區域性變數name之前訪問name變數會導致錯誤——如果是用var宣告,則會變數提升(但此時的var沒有賦值),則會先輸出undefined,再輸出區域性變數name的值。

<script type="text/javascript">
for (let i = 0; i < 10 ; i++)
{
	console.log(i);
}
// 報錯:Uncaught ReferenceError: i is not defined
console.log("迴圈體之外:" + i);
</script>

 使用let定義迴圈計數器,這樣該迴圈計數器 i 將只在for迴圈中有效,因此程式在迴圈體之外訪問 i 變數時候便會出錯。如果將for迴圈中的 let 改為 var,那麼在迴圈體中定義的 i 變數的作用域將會擴散到迴圈體之外。

2.用var定義的全域性變數不會變成windows物件的屬性。

<script type="text/javascript">
let name = 'yeeku';
console.log(name); //輸出yeeku
console.log(window.name); // window.name不存在
</script>

用var定義的全域性變數不會變成windows物件的屬性,因此上面程式訪問window.name時將看不到任何輸出。

const

  • 使用const定義的常量只能在定義時指定初始值。
  • 使用const宣告常量以後不允許改變常量值。
  • 常量不能和它所在作用域內其它變數或者函式擁有相同名稱。
const MAX_AGE=120;//正確

MAX_AGE=120;//錯誤

const MAX_AGE;//錯誤

MAX_AGE++;//錯誤