1990年代,是灰色緝毒犬PC防毒,迴紋針干擾文書,Internet Explorer 還是一支放大鏡,而網景Netscape Navigator 4.x宛如麥哲倫的時代。上網連線費以電話費計算,但凡遇見gif動圖就要停止加載,遑論拜見更多動態網頁特效。
不旋踵,Active Desktop偕著Windows 98 + IE 4.0 正式揭幕微軟瀏覽器壟斷王朝,也稍微過早地(在寬頻尚未普及的台灣)引入電腦聽電台、電腦看電視的新生活型態。儘管桌面那條塞滿「X視」、「OO之音」的吃資源頻道列沒有真正實用過(也沒人想在桌面開網頁,欠當機嗎?)。但自此開始,電腦網頁動態功能越來越多,而各種該動未動、載入異常的影片、動態網頁元素的Java們與Script們--諸如一捲紙(VBScript)、另一捲紙(JScript)、一杯咖啡(Java Applet)、另一杯咖啡(CoffeeScript)、阿貴動畫(不對)全部成為F(不對)紅色F符號(ActionScript)以及常常讓「動畫文字」、「輸入帳號密碼」區域一片灰的本文主角JavaScript也越來越常見,除了知道他們神通廣大,功能很多,一旦出現就可能當機之外,一但細究,都是一本本的磚塊大部頭。
在這時空背景下,網景Netscape 公司為增進網頁載入效率,遂著手開發當時還不叫JavaScript的JavaScript。網頁切換淡入淡出、狀態欄文字跑動、滑鼠觸發閃爍效果......不知凡幾的炫目效果,令JavaScript一度流行,但隨之而來的安全漏洞、裝飾過剩(險得俗氣)令它一度逐漸退潮。直至2005年AJAX技術興起,加上數十年中歷經數次基於歐洲電腦製造商協會(ECMA)標準規格(ECMAScript)的改版與規範,JavaScript終於成為各瀏覽器的普遍內建語言,得到廣泛使用,更是入門新手最有用的程式語言(之一)。
與一般程式語言相同,JavaScript也擁有幾類資料型別,構成其運作、運算、邏輯判斷的基礎。其中「變數」就是存放資料與進行運算的基本單位(資料的容器)。
變數名稱須遵守若干規則:
使用變數,就必須宣告變數。常見的宣告法有var、let、const三種,其間差別容後再秉。使用效果如:
var a; //宣告變數a,但未指定值,內容為undefined
var b = 1 //宣告變數b,指定值為1,內容為1
本處範例,以let或const宣告也有相同結果。
若未宣告就使用變數,會觸發錯誤(ReferencesError),這可以在Chrome開發者工具的Console下察知。但未被宣告的變數,仍可被指定值。如
d = 5;
console.log(d); //會印出變數d的值「5」
然而,這將使d變為全域變數,可能侵入不該影響的其他段落,在程式碼較多的程式中難以排查,易生意外。
這是JavaScript的特產。一般而言,程式撰寫及運作依循「由上至下」的順序,上面(前面)的定義與行為(出現)>影響>下面(後面),反之則不然。猶如:
昨天吃太多>導致>今天壞肚子
明天睡懶覺<不影響>今天開機coding
舉例來說,JavaScript中有undefined與not defined兩種「錯誤」訊息。前者是一切變數的預設值,代表「尚未定義」,其本身也是一個值(但還沒得到真正賦值,比如5、6、30等數字)。後者代表「沒有定義」,若變數沒有宣告就印出,就會如此。
換言之,變數要被宣告,能正常使用,才擁有值。又因為「由上至下」的邏輯,倘如沒有先(在上面)宣告,接著要(在下面)呼叫該變數,就理應得到not defined(沒有定義)錯誤。
然而,在「變數提昇」的影響下,若在函式下方用var宣告變數,結果不會跑出not define,而是跑出undefined,因為此時可以視作「JavaScript把變數提升到函式上方」了。
值得注意的是,僅有使用全域宣告的var才有此提昇效果。