🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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 之后受欢迎的休息。