如何更好的了解ECMAScript
本文源自于前段时间在团队内部的分享。稍微自己总结一下。
本文写自2016年9月21日。鉴于前端的飞速发展,一段时间后不能保证文章内的内容还没有过时。
什么是ECMAScript
首先既然要更好的了解,起码得先说说什么是 ECMAScript。
ECMAScript 是一种由 ECMA国际(前身为欧洲计算机制造商协会)通过 ECMA-262 标准化的脚本程序设计语言。
看起来出现了很多奇怪的名词,ECMA国际?ECMA-262?黑人问号???
那么然后来稍微介绍一下什么是 ECMA国际。
ECMA国际
Ecma国际(Ecma International)是一家国际性会员制度的信息和电信标准组织。1994年之前,名为欧洲计算机制造商协会(European Computer Manufacturers Association)。因为计算机的国际化,组织的标准牵涉到很多其他国家,因此组织决定改名表明其国际性。现名称已不属于首字母缩略字。
与国家政府标准机构不同,Ecma国际是企业会员制的组织。组织的标准化过程比较商业化,自称这种营运方式减少官僚追求效果。
上面这些信息都可以在 WIKI 中找到。大家可以很明确的看到,Ecma国际是一家和企业密切相连的组织,所以 Ecma国际制定的规范都是由各类企业来做主要的制定和推广。
那么既然说到了 Ecma国际,那么它都做了些什么事呢?
其实 Ecma国际负责了很多标准的制定,比如有如下这些规范。大家可以看到这里面有我们今天的主角,ECMAScript 规范。
- CD-ROM格式(之后被国际标准化组织批准为ISO 9660)
- C#语言规范
- C++/CLI语言规范
- 通用语言架构(CLI)
- ECMAScript语言规范(JavaScript)
- Eiffel语言
- 电子产品环境化设计要素
- Universal 3D标准
- OOXML
- Dart语言规范
JAVASCRIPT的诞生
在说 ECMA262 之前,我们先来讲讲 javascript 的历史。
在1994年,Netscape 发布了 Navigator0.9,但是因为那个时候的浏览器缺乏和用户有良好交互的能力。所以 Netscape 急切渴望一门可以在浏览器中运行,可以提供一定用户交互的语言。
然后在1995年,Netscape 让 Brendan Eich 去开发这门语言。然而,javascript 诞生了。
然而在此之后,Microsoft 推出了一门类似的语言,JScript。
Netscape 为了提升 javascript 的竞争力,于是将 javascript 提供给 ECMA组织 进行标准化。
然后,1997年7月,ECMA262 标准出台。
时隔14年之后,ECMA-262 标准也被另一个国际标准化组织 ISO(International Organization for Standardization)在2011年6月批准,标准号是 ISO-16262。
ECMAScript 作为一门脚本程序设计语言标准,并不只有 javascript 这一种实现,它也有很多的方言实现。比如有下面这些语言:
- JavaScript
- Ejscript
- JScript .NET
- ActionScript
- DMDScript
- CriScript
- InScript
- 飞速发展和稳定期
在 ECMAScript 规范初版发布后不久。
1998年6月,ECMAScript 2.0 发布。
1999年12月,ECMAScript 3.0 发布。
这时,ECMAScript 规范本身也相对比较完善和稳定了,但是接下来的事情,就比较悲剧了。
2007年10月。。。。ECMAScript 4.0 草案发布。
这次的新规范,历时颇久,规范的新内容也有了很多争议。
在制定ES4的时候,是分成了两个工作组同时工作的。
一边是以 Adobe, Mozilla, Opera 和 Google为主的 ECMAScript 4 工作组。
一边是以 Microsoft 和 Yahoo 为主的 ECMAScript 3.1 工作组。
ECMAScript 4 的很多主张比较激进,改动较大。而 ECMAScript 3.1 则主张小幅更新。
最终经过 TC39 的会议,决定将一部分不那么激进的改动保留发布为 ECMAScript 3.1,然后将一部分比较激进的部分放置到 ES.NEXT 中,命名为 Harmony(和谐),留待以后再进行商榷。接下来,ECMAScript 3.1 变成了 ECMAScript 5,而 ES.NEXT 中的那些特性,则有着相当一部分被ECMAScript 6,也就是 ECMAScript 2015 所吸收了。所以说虽然 ECMAScript 4 被废弃了,但是它终究还是通过另一种方式活了下来。
然后,2009年12月,ECMAScript 5 发布。
2011年6月,ECMAScript 5.1 发布。
TC39
中间插个小话题。其实在前面大家仔细看,会发现有个名词,TC39。为了接下来的内容,所以先来解释一下 TC39 是什么。
TC(Technical Committees)
TG(Task Groups)
在ECMA国际,每个标准都会有一个 TC 来负责,而一个 TC 中可能会有不同的 TG 来负责不同的工作。而负责 ECMA262,也就是我们所说的 ECMAScript 的就是 TC39(以前叫 TC39-TG1)。
Ecma organisation 在这里我们可以看到各个 TC,并且可以查看其负责的标准。
ECMAScript 2015
接下来是一部重头戏。
2015年6月,ECMAScript 6,也就是 ECMAScript 2015 发布了。
新的规范中,带有大量 ECMAScript 4 中激进特性,以及常年的提案积累。所以 ECMAScript 6 里和前一版标准有了非常大的差别。
从 ECMAScript 6 开始,标准有了新的,更加规范化和快速的制定流程。面对着每年一次的,频繁的标准更替,再采用1234的版本号来标注规范显得不太合适。所以从 ECMAScript 6 开始,就开始采用年号来做版本。即 ECMAScript 2015。
新的规范制定流程
在新的规范制定流程中,要求成文标准要从事实标准中诞生,实现先于标准存在,大家可以在接下来的流程说明中看出来。
每个新特性,从开始到完成一共要经历5个阶段。
strawman (稻草人)阶段
- 任何人都可以提交pull request到 GitHub - tc39/ecma262: Status, process, and documents for ECMA262
- 可以是一个提议,想法,初步描述
proposal(提案)阶段
- TC39制定成员作为 champion
- TC39审阅通过
- 有实现的 Demo 或者 Polyfill
- 初步描写标准的语义语法算法复杂度解决的问题等
Draft(草案)阶段
- 有两个或两个以上的实现(包括babel这类的转译实现)
- 使用正式的语言描述该语法,api等
candidate(候选)阶段
- 至少2个实现,可以为实验性实现
- ECMAScript spec editor 通过审核
- TC39 review 通过
- 文本编写完成
Finished(完成)阶段
- 编写 test 262 测试用例
- 通过两个实现该特性的内核测试
- ECMAScript spec editor 通过审核
- 开发者表示支持和认可
接下来,在每年的3月和9月,都会提交新特性的申请,在 ECMA General Assembly 通过以后,被添加到标准中去。
值得注意的是,TC39 每年的工作日程也是规划好了的。
每年的3月,TC39 会召开会议,将完成的特性添加到标准中。
每年的4月到6月,会由 ECMA CC 和 ECMA CG 来做 Review。
每年的7月,批准通过新标准并且发布。所以,ECMAScript 2016 标准,其实也已经正式发布了,虽然只新增了两个特性。我们现在已经可以开始看 ECMAScript 2017 的草案了。
迷茫的新特性
对于有些人来说,前端的更新总是很突兀,很让人迷茫。
但是其实不是的。变化总是一点一点发生的。
GitHub - tc39/proposals: Tracking ECMAScript Proposals
我们可以在 TC39 的 Github 仓库中找到完成了,废弃的,以及正在进行中的提案。
多去关注这些东西,对于很多新事物的到来,我们也就不会有多惊讶了。
别的 ECMA 标准?
和 ECMAScript 有关的标准只有 ECMA262 吗?
其实不是。和 ECMAScript 有关的标准有 ECMA262,ECMA290,ECMA327,ECMA357,ECMA402,ECMA404,ECMA414等等。
其中290,327,357等等没有推广开来,被废弃。
ECMA 262 是语言规范本身。
ECMA 402 则是制定一些基于 ECMAScript 5 或者之后版本的一些国际化 API 标准。
ECMA 404 是JSON规范。
ECMA 414 则规定了哪些规范是和 ECMAScript 有关的。目前内部就包含了 262,402和404。
备注
如果大家想更好的关注标准的变化,可以订阅 TC39 的邮件组,关注 TC39 的 Github,并且在 Twitter 上关注 TC39 的成员。