3. JavaScript 的历史和演变

优质
小牛编辑
129浏览
2023-12-01

原文: http://exploringjs.com/impatient-js/ch_history.html

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.

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”

测验

参见测验应用程序。