JavaScript 的版本
阿恆
近來網頁應用的開發人員越來越頭疼,微軟積極開發新版本的 IE,每一次都聲稱支援更多更新更標準的 JScript 功能,做為開放原碼的龍頭瀏覽器 Mozilla,新版本推出得更加頻密,每一次它所支援的 JavaScript 都好像提升一個版本,市場份額較少的 Opera 和 Safari 也標榜支援最新最標準的 JavaScript,甚至宣稱自己的 JavaScript 引擎效能更高,Adobe 也說它的 Flex 技術平台使用與 ECMAScript 3 兼容的 ActionScript,同一時間,幾乎所有主流瀏覽器都宣稱兼容 ECMAScript 3。ECMA 作為標準制定機構竟然也來製造混亂,忽然取消原定於 2008 年末推出的 ECMAScript 4,說今年會推出 ECMAScript 5,而ECMAScript 4 則改名為 ECMAScript Harmony,但沒有路線圖或時間表。作為一個開發人員,你怎樣理解這場混亂?
Script 引擎多頭發展
我們曾經介紹過 ECMAScript 和 JavaScript 的發展歷史和關係,本來大家期望 ECMA 在 1999 年把 JavaScript 標準化為 ECMAScript 3,瀏覽器之間的 JavaScript 標準戰爭可以平息,大家以後在同一個規範下開發跨平台、跨瀏覽器的 JavaScript,回看這十年的發展,情況根本不是這回事。
首先在稱呼方面,幾乎沒有瀏覽器稱自己的腳本語言為 ECMAScript。JavaScript 的原創者 Netscape 固然繼續稱之為 JavaScript,後繼的瀏覽器 Mozilla 也繼續這個稱呼。微軟方面一直使用 JScript 這個名稱,至今沒有改變,近年改為 JScript .NET。其他瀏覽器包括 Safari、Google Chrome 等沿用最廣為人知的 JavaScript,Adobe 的 Flash 和 Flex 技術平台則獨樹一幟稱為 ActionScript。
第二就是兼容性,隨著 ECMAScript 3 的發布,理論上所有瀏覽器都應該以此為藍本開發自己的腳本引擎,不錯,所有瀏覽器都宣稱他們與 ECMAScript 3 「兼容」,意思是 ECMAScript 3 有的他們都有──不過可能額外加多一些功能,而且隨著版本的提升,所添加的越來越多。以 Mozilla 為例,JavaScript 1.5 (2000 年在 Netscape 6 上出現)是第一個兼容 ECMAScript 3 的引擎,它額外支援 LiveConnect 這個繼承自 Netscape 的 Java API,此後在 Firefox 1.5 上的 JavaScript 1.6、Firefox 2.0 上的 JavaScript 1.7、最新的 Firefox 3.0 上的 JavaScript 1.8、和暫時仍是測試版本的 Firefox 3.5 上的 JavaScript 1.8.1,都陸續加如新功能,每一代 JavaScript 引擎都改善了與 ECMAScript 3 的兼容性,也加入一些構想中的 ECMAScript 4 的內容。
微軟的 JScript 在 IE 5.5 開始「自稱」兼容 ECMAScript 3,但其中的毛病不勝枚舉,我們也曾經介紹過一些(在 IE 中的 JavaScript split() 函數),這個引擎從 IE 5.5 至 IE 7 基本上沒有改動,直至 IE 8 才進行了一些除錯修正(不是說升級 IE 7, 8 沒有意思,它們在 DOM、CSS 等方面的改進無疑是巨大的,雖然這些改進其他瀏覽器很久以前已經做到了)。
Safari 和 Opera 則在 ECMAScript 3 之上加入了 Getters 和 Setters 等功能,Opera 甚至加入部份 JScript 和 JavaScript 的內容。
Rober Nyman 製作了一個 JavaScript 功能和瀏覽器兼容度測試網頁,讓你直接在瀏覽器執行 JavaScript 測試程式,也列出了各瀏覽器的 JavaScript 兼容度列表,還提供測試程式樣本和標準輸出以供參考。
ECMA 的動向
ECMAScript 4 原本是十年前的 ECMAScript 3 的重大更新,2007 年 10 月發布了規範的概覽,完整的規範原定於 2008 年 10 月竣工,但由於 Mozilla 和微軟兩大陣營在 ECMAScript 4 的路向上有重大分歧,Mozilla 的首席技術總裁 Brendan Eich (他就是 JavaScript 的發明人)和微軟的 IE 平台設計師 Chris Wilson 甚至隔空罵戰,以致規範的進度十分緩慢。
微軟於是夥同 Yahoo 和部份 ECMAScript 4 委員會的成員另起爐灶,著手規劃 ECMAScript 3.1,工作主要著重安全性、函式庫更新等,並且強調與 ECMAScript 3 兼容。
經過一輪角力和協調,2008 年 8 月兩幫委員又重新走在一起,同意合作開發 ECMAScript 3.1,並改名為 ECMAScript 5,打算在 2009 年 7 月中推出兩個實作 ECMAScript 5 的平台,規範化的過程預期在 2009 年末之前完成。
與 ECMAScript 3.1 (即現在的 ECMAScript 5) 的發展明朗化的同一時間,ECMA 宣布 ECMAScript Harmony 專案將會取代 ECMAScript 4,Harmony 的意思是和諧,這個名稱顯然具有深刻的意義,鑒於之前曾經發生的衝突,這個版本不論在語意和語法上的改動都較為溫和,例如取消了原本在 ECMAScript 4 的 packages、namespaces 和 early binding,部份技術構思和概念也重新包裝和表述,到目前為止 ECMAScript Harmony 尚未有的正式開發時間表,ECMA 將來也有可能把它改稱為 ECMAScript 6。