1. 程式人生 > >var關鍵字的使用

var關鍵字的使用

首先我們來看一段程式碼

var a = 1
b = 2

console.log(a)  //1
console.log(b)  //2

我們可以看到a, b都能被正常的輸出。區別只是在於a前邊有個“var”關鍵字,而b沒有,不過從結果上看似乎並沒有什麼區別,那到底“var”關鍵字有什麼用呢?再來看下一段程式碼。

function foo(){
    var a = 1
    b = 2
}

console.log(a)  //a is not defined
console.log(b)  //2

從上面的程式碼我們可以看出在函式中使用“var”關鍵字定義的變數a在輸出時出錯,提示未定義。而b卻被正常輸出了。

對比兩段程式碼,區別僅在於在後面一段的程式碼中,a,b被定義在了一個函式體內。而從錯誤提示中可以看出,使用了“var”關鍵字且被定義在函式內的a變數在函式外部無法被訪問。事實上,“var”關鍵字起到的作用時在當前作用域內宣告變數。換句話說,如果在方法內使用則是聲明瞭一個區域性變數,在全域性域內宣告則是聲明瞭一個全域性變數。

那麼,沒有使用“var”關鍵字的那個b為什麼無論定義在外部還是函式內都可以被訪問到呢?難道它是全域性變數麼?可是不是說“使用‘var’關鍵字在全域性域中宣告的變數才是全域性變數麼?”

var a = 1
b = 2

console.log(b)  //2
console.log(window.b)  //2
console.log(window)  //Window{....., b: 2}

從這段程式碼中可以看出我們定義的b變量出現在了window物件下併成為了它的一個屬性。直譯器在讀到這一句時會從當前的作用域鏈尋找是否已經存在b這個變數,如果存在則修改它的值為2,若不存在則在作用域鏈的最頂層物件,如window物件下建立b屬性並賦值2。所以在現在這種情況下,b並不是一個變數而是window物件的一個屬性。

看起來似乎全域性變數和全域性物件的屬性並沒有什麼區別,事實上,區別在於變數具有“不可刪除性”,而物件屬性是可以被刪除的。

var a = 1
b= 2

console.log(a)  //1
console.log(b)  //2

delete a
delete b

console.log(a)  //1
console.log(b)  //b is not defined