[TOC]
# 1. TC39 處理 ECMAScript 新特性的工作流程
本章解釋了所謂的 TC39 過程,該流程從ECMAScript 2016(ES7)開始管理著 ECMAScript 特性的設計。
## 1.1 誰設計ECMAScript?
答:TC39(技術委員會39)。
[TC39](http://www.ecma-international.org/memento/TC39.htm) 是發展 JavaScript 的委員會。它的成員都是公司(包括所有主要的瀏覽器供應商)。[TC39定期舉行會議](http://www.ecma-international.org/memento/TC39-M.htm),會議由會員派代表和受邀專家參加。會議記錄可以在[網上找到](https://github.com/tc39/tc39-notes),可以讓您更好地了解TC39是如何工作的。
有時(即使在本書中),您也會看到 TC39 成員一詞指的是某個人。也就是指的:TC39 成員公司派遣的代表。
有趣的是,TC39 是以協商一致方式運作的:決策要求絕大多數人都同意,沒有人強烈反對才能否決。 對于許多成員而言,協議帶來了真正的義務(他們必須實施功能等)。
## 1.2 ECMAScript是如何設計的?
### 1.2.1 問題:ECMAScript 2015(ES6)版本太大
ECMAScript 的最新版本 ES6 很大,,而且是在ES5的6年后標準化的(2009年12月 vs 2015年6月)。在兩次發布之間花費大量時間存在兩個主要問題:
* 比發行版早準備好的特性必須等到發行版完成。
* 那些需要很長時間才能完成的特性會承受很大的壓力,因為將它們推遲到下一個發布版本將意味著很長的等待。這些特性也可能會推遲發布。
因此,從ECMAScript 2016(ES7)開始,發布的頻率將會更高,因此發布的版本也會更小。每年將發布一個版本,它將包含在每年最后期限前完成的所有特性。
### 1.2.2 解決方案:TC39過程
ECMAScript特性的每個提案都要經歷以下幾個成熟階段,從階段0開始。從一個階段到下一個階段的進展必須得到TC39的批準。
#### 1.2.2.1 階段0:strawman
**它是什么**?為 ECMAScript 的發展提供一種自由的提交想法的方式。提交者必須是TC39成員或[已注冊為TC39貢獻者](http://www.ecma-international.org/memento/contribute_TC39_Royalty_Free_Task_Group.php)的非成員。
**需要什么**?該文檔必須在TC39會議上進行審核([來源](https://github.com/tc39/ecma262/blob/master/FAQ.md)),然后將其添加到[帶有階段0提案的頁面](*https://github.com/tc39/ecma262/blob/master/stage0.md**)中。
#### 1.2.2.2 階段1:proposal
**它是什么**?該特性的正式提案。
**需要什么?** 必須確定負責該提案的所謂擁護者(*champion*)。 擁護者或聯合擁護者必須是 TC39 的成員([來源](https://github.com/tc39/ecma262/blob/master/FAQ.md))。 提案解決的問題必須以散文形式描述。解決方案必須通過示例,API 以及語義和算法的討論來描述解決方案。 最后,必須確定提案的潛在障礙,例如與其他特征的相互作用和實施挑戰。 在實現方面,需要 polyfill 和演示。
**下一步是什么**? 通過接受階段1的提案,TC39 宣布愿意審查,討論并為該提案做出貢獻。 展望未來,有望對該提案進行重大更改。
#### 1.2.2.3 階段2:draft
**它是什么**?規范中內容的第一個版本。在這一點上,該特性可能最終包含在標準中。
**需要什么**? 現在,該提案還必須對該特性的語法和語義進行正式描述(使用 ECMAScript 規范的正式語言)描述應該盡可能完整,但是可以包含待辦事項和占位符。 需要對該特性進行兩個實驗性的實現,但是其中一個可以在諸如Babel 的編譯器中進行實現。
**下一步是什么**? 從現在開始,只會進行預期增量更改。
#### 1.2.2.4 階段3:candidate
**它是什么**? 該提案大部分已經完成,現在需要實現和用戶的反饋來進一步推進。
**需要什么**? 規范文本必須完整。 指定的審閱者(由 TC39 任命,而不由 擁護者任命)和 ECMAScript 規范編輯者必須在規范文本上簽字。 必須至少有兩個符合規范的實現(默認情況下不必啟用)。
**下一步是什么**? 從今以后,僅應針對實現及其使用引起的關鍵問題進行更改。
#### 1.2.2.5 階段4:finished
**它是什么**? 該提案已準備好包含在標準中。
**需要什么**? 提案到達此階段需要做以下事情:
* [測試 262](https://github.com/tc39/test262) 驗收測試(大致來說,是用 JavaScript 編寫的語言功能單元測試)。
* 通過測試的兩個符合規范的運輸實現。
* 具有豐富的實踐經驗。
* ECMAScript 規范編輯器必須在規范文本上簽名。
**下一步是什么**? 該提案將盡快包含在 ECMAScript 規范中。當規范作為標準經過每年一次的批準時,提案也被批準為標準的一部分。
## 1.3 不要稱它們為ECMAScript 20xx功能
如您所見,您只能確保在其提案達到第4階段后就將其包含在標準中。然后下一個 ECMAScrip t版本很可能包含它,但也不是100%確定(可能需要更長的時間)。 因此,您將無法再調用提案(例如)“ ES7 功能”或“ ES2016 功能”。 因此,我最喜歡的兩種撰寫文章和博客文章標題的方式是:
* “ ECMAScript建議:foo 功能”。在本文的開頭提到了提案的階段。
* “ ES.stage2:foo 功能”
如果提案處于第4階段,我可以把它稱為 ES20xx 特性,但是最安全的做法是等到規范編輯器確認它將包含在哪個版本中。`Object.observe`是 ECMAScript 提案的一個例子,它一直進展到第2階段,但最終被撤回。
## 1.4 進一步閱讀
以下是本章的重要來源:
* [The ecma262 (ECMA-262 is the ID of the ECMAScript standard) GitHub repository](https://github.com/tc39/ecma262), which contains:
* [A readme file with all proposals at stage 1 or higher](https://github.com/tc39/ecma262/blob/master/README.md)
* [A list of stage 0 proposals](https://github.com/tc39/ecma262/blob/master/stage0.md)
* [ECMA-262 frequently asked questions](https://github.com/tc39/ecma262/blob/master/FAQ.md)
* [The TC39 process document](https://tc39.github.io/process-document/)
其他需要閱讀的東西:
* [Kangax 的 ES7 兼容性表](https://kangax.github.io/compat-table/es7/)顯示了支持哪些提案,并按階段將提案分組。
* 有關 ES6 設計過程的更多信息:《Exploring ES6》中的 [“如何設計ECMAScript 6”](http://exploringjs.com/es6/ch_about-es6.html#_how-ecmascript-6-was-designed)部分
# 2. FAQ: ES2016 and ES2017
## 2.1 ECMAScript 2016 會不會太小?
ES2016如此之小,表明新的發行過程(如上一章所述)有效:
* 只有在新功能完全準備好并且至少有兩個經過充分的實際測試之后,才會包含這些新特性。
* 發布的頻率更頻繁(一年一次),并且可以增加增量。
ES2016將給每個人(TC39,引擎實現者,JS開發者)喘息的時間,這是在發布大量 ES6 之后受歡迎的休息。