[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 之后受欢迎的休息。