ECMAScript 的變量是松散類型的,所謂松散類型就是可以用來保存任何類型的數據。換句話說,每個變量僅僅是一個用于保存值的占位符而已。定義變量時要使用 var 操作符(注意 var 是一個關鍵字),后跟變量名(即一個標識符),如下所示:
var message;
這行代碼定義了一個名為 message 的變量,該變量可以用來保存任何值(像這樣未經過初始化的變量,會保存一個特殊的值——undefined,相關內容將在 3.4 節討論)。 ECMAScript 也支持直接初始化變量,因此在定義變量的同時就可以設置變量的值,如下所示:
var message = "hi";
在此,變量 message 中保存了一個字符串值"hi"。像這樣初始化變量并不會把它標記為字符串類型;初始化的過程就是給變量賦一個值那么簡單。因此,可以在修改變量值的同時修改值的類型,如下所示:
var message = "hi";
message = 100; // 有效,但不推薦
在這個例子中,變量 message 一開始保存了一個字符串值"hi",然后該值又被一個數字值 100 取代。雖然我們不建議修改變量所保存值的類型,但這種操作在 ECMAScript 中完全有效。
有一點必須注意,即用 var 操作符定義的變量將成為定義該變量的作用域中的局部變量。也就是說,如果在函數中使用 var 定義一個變量,那么這個變量在函數退出后就會被銷毀,例如:
function test() {
var message = "hi"; // 局部變量
}
test();
alert(message); // 錯誤!
這里,變量 message 是在函數中使用 var 定義的。當函數被調用時,就會創建該變量并為其賦值。
而在此之后,這個變量又會立即被銷毀,因此例子中的下一行代碼就會導致錯誤。不過,可以像下面這樣省略 var 操作符,從而創建一個全局變量:
function test() {
message = "hi"; // 全局變量
}
test();
alert(message); // "hi"
這個例子省略了 var 操作符,因而 message 就成了全局變量。這樣,只要調用過一次 test()函數,這個變量就有了定義,就可以在函數外部的任何地方被訪問到。
雖然省略 var 操作符可以定義全局變量,但這也不是我們推薦的做法。因為在局部作用域中定義的全局變量很難維護,而且如果有意地忽略了 var 操作符,也會由于相應變量不會馬上就有定義而導致不必要的混亂。給未經聲明的變量賦值在嚴格模式下會導致拋出 ReferenceError 錯誤。
可以使用一條語句定義多個變量,只要像下面這樣把每個變量(初始化或不初始化均可)用逗號分隔開即可:
var message = "hi",
found = false,
age = 29;
這個例子定義并初始化了 3 個變量。同樣由于 ECMAScript 是松散類型的,因而使用不同類型初始化變量的操作可以放在一條語句中來完成。雖然代碼里的換行和變量縮進不是必需的,但這樣做可以提高可讀性。
在嚴格模式下,不能定義名為 eval 或 arguments 的變量,否則會導致語法錯誤。