3. JavaScript 的历史和演变
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)拥有后者名称的商标。 “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 月):带来了一些小改进 - 一些标准库功能和 严格模式 。
- ECMAScript 5.1(2011 年 6 月):另一项保持 Ecma 和 ISO 标准同步的小更新。
- ECMAScript 6(2015 年 6 月):一个大型更新,履行了 ECMAScript 4 的许多 Promise。这个版本是第一个正式名称 - 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 存储库中。
3.5。 TC39 流程
使用 ECMAScript 6,当时使用的发布过程有两个问题变得明显:
如果在版本之间经过太多时间,那么早期准备好的功能必须等待很长时间才能发布。并且已经准备好的功能可能会被迫赶上截止日期。
功能通常在实现和使用之前很久就已设计好。因此,发现与实施和使用相关的设计缺陷为时已晚。
针对这些问题,TC39 制定了新的 TC39 流程 :
- ECMAScript 功能是独立设计的,经历各个阶段,从 0 开始(“稻草人”),结束于 4(“完成”)。
- 特别是后期阶段需要原型实现和实际测试,从而导致设计和实现之间的反馈循环。
- ECMAScript 版本每年发布一次,包括在发布截止日期之前已达到第 4 阶段的所有功能。
结果:较小的增量版本,其功能已经过现场测试。图 1 说明了 TC39 过程。
Figure 1: Each ECMAScript feature proposal goes through stages that are numbered from 0 to 4. Champions are TC39 members that support the authors of a feature. Test 262 is a suite of tests that checks JavaScript engines for compliance with the language specification.
ES2016 是第一个根据 TC39 流程设计的 ECMAScript 版本。
有关 TC39 过程的更多信息,请参阅“探索 ES2018 和 ES2019”。
3.5.1。提示:考虑个别功能和阶段,而不是 ECMAScript 版本
在 ES6 之前,最常见的是根据 ECMAScript 版本来考虑 JavaScript。例如:“这个浏览器是否支持 ES6?”
从 ES2016 开始,最好考虑单个功能:一旦功能到达第 4 阶段,您就可以安全地使用它(如果它受到您所定位的 JavaScript 引擎的支持)。您不必等到下一个 ECMAScript 发布。
3.6。常见问题:TC39 流程
3.6.1。 [我最喜欢的功能]如何做?
如果您想了解各种提议功能的各个阶段,请参考 GitHub 存储库proposals
。
3.6.2。是否有正式的 ECMAScript 功能列表?
是的,TC39 回购列出了完成的提案,并提到了它们被引入的 ECMAScript 版本。
3.7。不断发展的 JavaScript:不要破坏网络
偶尔出现的一个想法是通过删除旧功能和怪癖来清理 JavaScript。虽然这个想法的吸引力是显而易见的,但它有明显的缺点。
让我们假设我们创建了一个不向后兼容的 JavaScript 新版本并修复了它的所有缺陷。结果,我们遇到了以下问题:
- JavaScript 引擎变得臃肿:它们需要支持旧版本和新版本。对于诸如 IDE 和构建工具之类的工具也是如此。
- 程序员需要知道并不断意识到版本之间的差异。
- 您可以将所有现有代码库迁移到新版本(这可能需要大量工作)。或者你可以混合版本和重构变得更难,因为你无法在不改变它的情况下在版本之间移动代码。
- 你不得不指定每段代码 - 无论是嵌入在网页中的文件还是代码 - 它是用什么版本编写的。每个可想到的解决方案都有利有弊。例如, 严格模式 是 ES5 稍微清洁的版本。它之所以不那么流行的原因之一是:在文件或函数的开头通过指令选择加入是一件麻烦事。
那么解决方案是什么?我们可以吃蛋糕吗?为 ES6 选择的方法称为“One JavaScript”:
- 新版本总是完全向后兼容(但偶尔可能会有轻微的,几乎不可察觉的清理)。
- 旧功能不会被删除或修复。相反,它们会引入更好的版本。一个例子是通过
let
声明变量 - 这是var
的改进版本。 - 如果语言的某些方面发生了变化,那么它就会在新的语法结构中完成。也就是说,你隐含地选择加入。例如,
yield
只是生成器内部的关键字(在 ES6 中引入)。模块和类中的所有代码(都在 ES6 中引入)隐式处于严格模式。
有关 One JavaScript 的更多信息,请参阅“探索 ES6”。
测验
参见测验应用程序。