1997:ECMAScript 1 標準化#
事件#
1997年6月,ECMA International 發佈 ECMA-262 第一版(ECMAScript 1),把 JavaScript 從網景的專屬技術變成國際標準。標準化由 Netscape 提交,微軟、Sun 等公司共同參與。
為何重要#
- 解決碎片化:JScript 與 JavaScript 行為不一樣的問題有了裁決依據——「ECMAScript 說了算」。
- 確立格局:JavaScript 是 Netscape 的商標名稱,ECMAScript 是語言標準;JScript 是微軟的實作。這個「語言 vs 標準 vs 實作」的三層結構沿用至今。
- 名稱之謎:ECMA 不允許使用商標名 JavaScript,故取 ECMAScript(Eich 本人事後表示「一直很後悔這個名字」)。
標準化的內容#
以 Netscape JavaScript 1.1 為基礎,規範了: - 型別系統(Undefined、Null、Boolean、Number、String、Object) - 原型繼承與 new、建構函式 - 函數、閉包、詞法作用域 - C 風格控制流程
理論與實用原因#
- 理論原因:語言標準化是程式語言存活的必要條件——C 有 ANSI C(1989)、SQL 有 ISO 標準;沒有標準的語言會隨廠商起落而消亡。
- 實用原因:瀏覽器大戰下開發者需要「寫一次、處處執行」的保證,碎片化正在扼殺 Web 開發。
彌補了什麼缺陷#
彌補了1996年 JScript 與 JavaScript 各自為政的碎片化缺陷,以及「語言命運綁定單一公司」的風險。這是 JavaScript 能存活超過30年的最關鍵決定——VBScript 因封閉消亡(見 1996-VBScript問世),JavaScript 因開放標準長存。
相關條目#
程式範例#
ES1 規範的核心語言面(以 Netscape JavaScript 1.1 為基礎):
// 1. 六種型別:Undefined, Null, Boolean, Number, String, Object
typeof undefined; // "undefined"
typeof null; // "object"(歷史 bug,至今未修)
typeof 42; // "number"
// 2. 建構函式與原型鏈
function Person(name) { this.name = name; }
Person.prototype.hello = function () { return "Hi, " + this.name; };
var p = new Person("Ada");
p.hello(); // "Hi, Ada"
// 3. 詞法作用域與閉包
function outer() {
var x = 10;
return function () { return x; };
}
outer()(); // 10
標準化的意義在於:這段程式碼在 Netscape 與 IE 中的行為必須一致——在此之前,document.all 這類 API 各家不同,連基本語義都可能分歧。