## 3\. JavaScript 的歷史和演變
> 原文: [http://exploringjs.com/impatient-js/ch_history.html](http://exploringjs.com/impatient-js/ch_history.html)
### 3.1 JavaScript 是如何誕生的
JavaScript 由 Brendan Eich 于 1995 年 5 月創建,工期 10 天。 Eich 在 Netscape 工作并為它的網絡瀏覽器 _Netscape Navigator_ 實現了 JavaScript。
當時,人們認為 Web 客戶端的主要交互部分將用 Java 實現。 JavaScript 應該是這些部分的粘合語言,并且可以使 HTML 更具交互性。鑒于它在協助 Java 方面的作用,JavaScript 必須看起來像 Java。這排除了現有的解決方案,如 Perl,Python,TCL 等。
最初,JavaScript 的名稱改變了數次:
* 它的代號是 _Mocha_ 。
* 在 Netscape Navigator 2.0 測試版(1995 年 9 月)中,它被稱為 _LiveScript_ 。
* 在 Netscape Navigator 2.0 beta 3(1995 年 12 月)中,它的最終名稱為 _JavaScript_ 。
### 3.2 標準化
JavaScript 有兩個標準:
* ECMA-262 由 Ecma International 主持。這是主要標準。
* ISO / IEC 16262 由國際標準化組織(ISO)和國際電工委員會(IEC)主持。這是次要標準。
這些標準描述的語言稱為 _ECMAScript_ ,而不是 _JavaScript_ 。使用不同的名稱,是因為 Sun(現在的 Oracle)擁有“Java”的商標。“ECMAScript”中的“ECMA”來自主持主要標準的組織。
該組織的原始名稱是 _ECMA_ ,_歐洲計算機制造商協會_ 的首字母縮寫。后來它改名成了 _Ecma International_ (“Ecma”是一個專有名稱,而不是縮寫),因為該組織的活動已經擴展到歐洲以外。ECMAScript 的拼寫仍然使用全大寫的縮寫。
原則上,JavaScript 和 ECMAScript 是同一個東西。但有時,會做出以下區分:
* 術語 _JavaScript_ 指的是語言及其實現。
* 術語 _ECMAScript_ 是指語言標準和語言版本。
因此, _ECMAScript 6_ 是該語言的一個版本(其第 6 版)。
### 3.3 ECMAScript 版本的時間表
這是 ECMAScript 版本的簡要時間表:
* ECMAScript 1(1997 年 6 月):該標準的第一版。
* ECMAScript 2(1998 年 6 月):小更新,使 ECMA-262 與 ISO 標準保持同步。
* ECMAScript 3(1999 年 12 月):添加了許多核心功能——“[...]正則表達式,更好的字符串處理,新的控制語句[do-while,switch],try / catch 異常處理,[...]”
* ECMAScript 4(2008 年 7 月放棄):本來是一次大規模的升級(使用靜態類型,模塊,命名空間等),但最終變得過于激進并且導致了陣營分歧。因此,它被放棄了。
* ECMAScript 5(2009 年 12 月):帶來了一些小改進——一些標準庫功能和 [_嚴格模式_](ch_syntax.html#strict-mode) 。
* ECMAScript 5.1(2011 年 6 月):另一項保持 Ecma 和 ISO 標準同步的小更新。
* ECMAScript 6(2015 年 6 月):一個大型更新,履行了 ECMAScript 4 的許多承諾。這個版本的正式名稱是 _ECMAScript 2015_,它是首個基于發布年份的名稱。
* ECMAScript 2016(2016 年 6 月):第一次年度發布。與 ES6 的全面更新相比,較短的發布生命周期導致新功能較少。
* ECMAScript 2017(2017 年 6 月)。第二次年度發布。
* 隨后的 ECMAScript 版本(ES2018 等)始終會在 6 月份獲得批準。
### 3.4 Ecma 技術委員會 39(TC39)
TC39 是發展 JavaScript 的委員會。嚴格來說,它的成員都是公司:Adobe,Apple,Facebook,Google,Microsoft,Mozilla,Opera,Twitter 等。這些公司通常是激烈的競爭對手,但它們正在為語言的利益而共同努力。
每兩個月,成員任命的代表和受邀專家會參加 TC39 會議。這些會議的記錄是公開的,可以在 [GitHub 倉庫](https://github.com/tc39/tc39-notes/)中看到。
### 3.5 TC39 流程
通過 ECMAScript 6,我們可以看到當時的發布過程存在兩個明顯的問題:
* 如果在版本之間隔了太長時間,那么早期準備好的功能必須等待很長時間才能發布,并且沒有準備好的功能可能會趕不上死線。
* 功能通常在實現和使用之前很久就已設計好。因此,當發現與實現和使用相關的設計缺陷時,通常為時已晚。
針對這些問題,TC39 制定了新的 _TC39 流程_:
* ECMAScript 功能是分別獨立設計的,而且會經歷 5 個階段,從 0 開始(“Strawman”),結束于 4(“Finished”)。
* 后期的幾個階段需要原型實現和實際測試,從而獲得設計和實現之間的有效交互。
* ECMAScript 版本每年發布一次,將會包括在發布截止日期之前已達到第 4 階段的所有功能。
因此,我們可以獲得:每個版本變動較小,帶有經過實際測試的特性。圖 [1](#fig:tc39-process-stages) 說明了 TC39 過程。

圖 1:每個 ECMAScript 特性的提案會經過從 0 到 4 依次編號的 5 個階段。_Champions_ 是指支持某個特性提案的 TC39 成員。 Test 262 是一套測試,用于檢測 JavaScript 引擎是否正確實現了語言標準。
ES2016 是第一個根據 TC39 流程設計的 ECMAScript 版本。
有關 TC39 過程的更多信息,請參閱[“探索 ES2018 和 ES2019”](es2018-es2019/ch_tc39-process.html)。
#### 3.5.1 提示:讓你的思路適應獨立的功能和階段,而不是一整個 ECMAScript 版本
在 ES6 之前,最常見的想法是根據 ECMAScript 版本來考慮 JavaScript。例如:“這個瀏覽器是否支持 ES6?”
從 ES2016 開始,最好開始考慮單個功能:一旦功能到達第 4 階段,你就可以安全地使用它(只要它被你所使用的 JavaScript 引擎所支持),而不必等到下一個 ECMAScript 版本發布。
### 3.6 常見問題:關于 TC39 流程
#### 3.6.1 [填入你最喜歡的功能]進展怎么樣?
如果您想了解每個特性草案處于什么階段,請參考 [GitHub 倉庫 `tc39/proposals`](https://github.com/tc39/proposals) 。
#### 3.6.2 是否有正式的 ECMAScript 特性列表?
是的,TC39 的倉庫里列出了[已經完成的提案](https://github.com/tc39/proposals/blob/master/finished-proposals.md),并提到了它們在哪個 ECMAScript 版本被引入。
### 3.7 JavaScript 進化哲學:不要破壞(特性)網絡
經常出現的一個想法是通過刪除舊功能和各種坑來清理 JavaScript。雖然這個想法很有吸引力,但它也有明顯的缺點。
假設我們創建了一個不向后兼容的 JavaScript 新版本并修復了它的所有缺陷。結果,我們遇到了以下問題:
* JavaScript 引擎變得臃腫:它們需要支持舊版本和新版本。對于諸如 IDE 和構建工具之類的工具也是如此。
* 程序員需要知道并不斷注意版本之間的差異。
* 你要么將所有現有代碼庫遷移到新版本(這可能需要大量工作),要么混合兩種版本,讓重構變得更難——因為你無法在不改代碼的情況下在版本之間共用代碼。
* 你不得不指定每段代碼是用什么版本編寫的,無論是嵌入在網頁中的代碼還是單獨的文件。每個可想到的解決方案都有利有弊。例如, [_嚴格模式_](ch_syntax.html#strict-mode) 是 ES5 的稍微改進的版本。它之所以不那么流行的原因之一是:在文件或函數的開頭通過加入指令來啟用功能是一件麻煩事。
那么解決方案是什么?我們能達到我們的目標嗎?ES6 選擇的方法稱為“One JavaScript”:
* 新版本總是完全向后兼容(但偶爾可能會有輕微的,幾乎不可察覺的清理)。
* 舊功能不會被刪除或修復。相反,會有一個更好的功能作為替代。一個例子是通過 `let` 聲明變量——這是 `var` 的改進版本。
* 如果語言本身的某些方面發生了變化,那么這個變化只會在某個新的語法環境里應用。也就是說,你不需要做任何特定的聲明。例如,`yield` 只是生成器內部的關鍵字(它在 ES6 中被引入);而模塊和類中的所有代碼(它們都在 ES6 中引入)隱式地處于嚴格模式。
有關 One JavaScript 的更多信息,請參閱[“探索 ES6”](es6/ch_one-javascript.html)。
 **測驗**
參見[測驗應用程序](ch_quizzes-exercises.html#quizzes)。
- I.背景
- 1.關于本書(ES2019 版)
- 2.常見問題:本書
- 3. JavaScript 的歷史和演變
- 4.常見問題:JavaScript
- II.第一步
- 5.概覽
- 6.語法
- 7.在控制臺上打印信息(console.*)
- 8.斷言 API
- 9.測驗和練習入門
- III.變量和值
- 10.變量和賦值
- 11.值
- 12.運算符
- IV.原始值
- 13.非值undefined和null
- 14.布爾值
- 15.數字
- 16. Math
- 17. Unicode - 簡要介紹(高級)
- 18.字符串
- 19.使用模板字面值和標記模板
- 20.符號
- V.控制流和數據流
- 21.控制流語句
- 22.異常處理
- 23.可調用值
- VI.模塊化
- 24.模塊
- 25.單個對象
- 26.原型鏈和類
- 七.集合
- 27.同步迭代
- 28.數組(Array)
- 29.類型化數組:處理二進制數據(高級)
- 30.映射(Map)
- 31. WeakMaps(WeakMap)
- 32.集(Set)
- 33. WeakSets(WeakSet)
- 34.解構
- 35.同步生成器(高級)
- 八.異步
- 36. JavaScript 中的異步編程
- 37.異步編程的 Promise
- 38.異步函數
- IX.更多標準庫
- 39.正則表達式(RegExp)
- 40.日期(Date)
- 41.創建和解析 JSON(JSON)
- 42.其余章節在哪里?