ECMAScript的變量是松散類型的,所謂松散類型就是可以用來(lái)保存任何類型的數(shù)據(jù)。換句話說(shuō),每個(gè)變量?jī)H僅是一個(gè)用于保存值的占位符而已。定義變量時(shí)要使用 var 操作符(注意 var 是一個(gè)關(guān)鍵字)因俐,后跟變量名(即一個(gè)標(biāo)識(shí)符),如下所示:
var message;
這行代碼定義了一個(gè)名為 message 的變量,該變量可以用來(lái)保存任何值(像這樣未經(jīng)過(guò)初始化的變量抹剩,會(huì)保存一個(gè)特殊的值—— undefined )撑帖。ECMAScript 也支持直接初始化變量,因此在定義變量的同時(shí)就可以設(shè)置變量的值澳眷,如下所示:
var message = “hi”;
在此胡嘿,變量 message 中保存了一個(gè)字符串值 “hi” 。像這樣初始化變量并不會(huì)把它標(biāo)記為字符串類型钳踊;初始化的過(guò)程就是給變量賦一個(gè)值那么簡(jiǎn)單衷敌。因此,可以在修改變量值的同時(shí)修改值的類型拓瞪,如下所示:
var message = “hi”;
message = 100; // 有效缴罗,但不推薦
在這個(gè)例子中,變量 message 一開(kāi)始保存了一個(gè)字符串值 “hi” 祭埂,然后該值又被一個(gè)數(shù)字值 100 取代面氓。雖然我們不建議修改變量所保存值的類型,但這種操作在ECMAScript 中完全有效蛆橡。
有一點(diǎn)必須注意舌界,即使用 var 操作符定義的變量將成為定義該變量的作用域中的局部變量。也就是說(shuō)泰演,如果在函數(shù)中使用 var 定義一個(gè)變量呻拌,那么這個(gè)變量在函數(shù)退出后就會(huì)被銷毀,例如:
function test(){
var message = “hi”; // 局部變量
}
test();
alert(message); // 錯(cuò)誤睦焕!
這里藐握,變量 message 是在函數(shù)中使用 var 定義的。當(dāng)函數(shù)被調(diào)用時(shí)复亏,就會(huì)創(chuàng)建該變量并為其賦值趾娃。而在此之后,這個(gè)變量又會(huì)立即被銷毀缔御,因此例子中的下一行代碼就會(huì)導(dǎo)致錯(cuò)誤。不過(guò)妇蛀,可以像下面這樣省略 var 操作符耕突,從而創(chuàng)建一個(gè)全局變量:
function test(){
message = “hi”; // 全局變量
}
test();
alert(message); // “hi”
這個(gè)例子省略了 var 操作符,因而 message 就成了全局變量评架。這樣眷茁,只要調(diào)用過(guò)一次test() 函數(shù),這個(gè)變量就有了定義纵诞,就可以在函數(shù)外部的任何地方被訪問(wèn)到上祈。
提示
雖然省略 var 操作符可以定義全局變量,但這也不是我們推薦的做法。因?yàn)樵诰植孔饔糜蛑卸x的全局變量很難維護(hù)登刺,而且如果有意地忽略了 var 操作符籽腕,也會(huì)由于相應(yīng)變量不會(huì)馬上就有定義而導(dǎo)致不必要的混亂。給未經(jīng)聲明的變量賦值在嚴(yán)格模式下會(huì)導(dǎo)致拋出 ReferenceError 錯(cuò)誤纸俭。