首页 存档 技术 查看内容

JavaScript的演变史,它在走向何处?(下篇)

2018-3-30 13:00 |来自: 互联网 250 0

摘要: ECMAScript 3.1 和 4:斗争之年 不幸的是,随后几年JavaScript 发展并不顺利。从 ECMAScript 4 的工作一开始,委员会中就开始出现了强烈的分歧。有一群人认为 JavaScript 需要一些特性来成为一种更强大的语言,这样 ...

ECMAScript 3.1 和 4:斗争之年

不幸的是,随后几年JavaScript 发展并不顺利。从 ECMAScript 4 的工作一开始,委员会中就开始出现了强烈的分歧。有一群人认为 JavaScript 需要一些特性来成为一种更强大的语言,这样就可以用于大型应用程序开发。这群人提出了很多特性,这些特性涉及面广,变化大。另一群人认为大型应用程序开发不是 JavaScript 适合的方向。由于缺乏一致意见,加上新提出的某些特性的复杂性,将 ECMAScript 4 的发布变得遥遥无期。

实际上针对ECMAScript 4的工作在 1999 年 版本 3 刚出炉的时候,就已经开始了。网景公司内部讨论了很多有意义的特性。不过,实现这些特性的兴趣已经逐渐减弱,并且 2003 年刚过没多久,在新版本 ECMAScript 上的工作就停止了。一个临时报告发布了,有些实现者,比如 Adobe(ActionScript)和微软(JScript.NET),使用这个报告作为其引擎的基础。2005 年,在 AJAX 和XMLHttpRequest的影响之下,再度激发了新版本 JavaScript 的兴趣,TC-39 重启了工作。几年过去了,特性集变得越来越大。在 ECMAScript 4 开发的最高峰,有如下这些特性:

  • 接口

  • 命名空间

  • 可选的类型注解

  • 可选的静态类型检查

  • 结构类型

  • 类型定义

  • 多方法(Multimethods)

  • 参数化类型

  • 尾调用

  • 迭代器(Iterator)

  • 生成器(Generator)

  • 内省

  • 类型识别的异常处理器

  • 常量绑定

  • 块作用域

  • 解构

  • 函数表达式

  • 数组推导式(Array comprehensions)

ECMAScript 4草案将这个新版本描述为编写大型应用程序而设计。如果你已熟悉 ECMAScript 6/2015,就会注意到很多来自 ECMAScript 4 的特性被重新引入了。

虽然 ES3 灵活,并且在形式上很强大,但是在开发大型软件系统实践中,它的抽象能力经常是无法胜任的。由于在 Web 上采用 Ajax 编程,在应用程序中大量使用 ECMAScript 作为插件以及脚本语言,ECMAScript 程序正变得越来越大,越来越复杂。大型程序的开发可以从静态类型检查、名称隐藏、早绑定以及其它优化手段、直接支持面向对象编程等技术上大大受益,而这些都是 ES3 中所缺乏的。 -ECMAScript 4 草案

一则有趣的历史片段是如下的Google Docs spreadsheet,这个文件展示了几种 JavaScript 引擎的实现状态,以及涉及其中的派系的讨论。

开发 ECMAScript 4 的委员会由 Adobe、Mozilla、Opera(以非官方身份)和微软组成。Yahoo 在大部分标准和特性已经决定了后,进入了这个委员会。Doug Crockford,一个有影响力的 JavaScript 开发者,就是 Yahoo 为此送进委员会的那个人。他鼓吹他的担忧,强烈反对很多 ECMAScript 4 提议的修改。他从微软的代表那里获得了强烈的支持。Crockford 本人说到:

但是结果微软的委员也有同样的担忧 - 他也认为这门语言正变得太大,失去了控制。在我加入委员会之前,他什么都没有说,因为他担心,如果微软试着阻拦这件事,就会被指责为反竞争行为。根据微软过去的表现,也许他们有一些不错的理由对此在意 - 并且很显然,这些担忧是有理有据的,因为已经发生过。但是我劝他说,微软应该做正确的事情,并且以他的声誉,他决定他应该,也能说服微软。所以微软就在 ES4 上改变了立场。 -Douglas Crockford JavaScript 的现状和未来

开始是怀疑,后来就变成强势反对 JavaScript。微软拒绝接受 ECMAScript 4 的所有部分,并且准备采取各种必要的行动来阻止标准获得通过(甚至法律诉讼)。幸运的是,委员会中的人设法阻止了法律斗争。不过,缺乏共识有效地阻止了 ECMAScript 4 推进。

微软的某些人想在这件事情上采取强硬手段,他们想开始建立书面凭据,开始走申诉程序,想做这些额外的法律程序。我可不想有这种事情。我是不同意 ES4,但是仅限于技术层面,并且我想只限于技术层面;我不想让它变得比以前更麻烦。我只是想搞清楚什么事情该做,所以我设法温和一点。但是微软依然采取了极端立场,说他们拒绝接受 ES4 的任何部分。所以事情就变成了两极分化,但是我认为两极分化是因为 ES4 团队拒绝考虑任何其它观点的结果。那时委员会没有达成共识,这是件糟糕的事情,因为标准小组必须要达成共识。一个标准不应该是有争议的。 -Douglas Crockford JavaScript 的现状和未来

Crockford 想出一个点子来推进,就是重新弄一个标准,这个标准更简单,减少一些特性集,这样所有人都可以同意:没有新语法,只有来自使用该语言的经历中的实际提升。这个提案后来被称为 ECMAScript 3.1。

有一段时间,两种标准并存,并且设置了两个非正式的委员会。不过,ECMAScript 4 太复杂,没办法在面对冲突的情况完成。ECMAScript 3.1 更简单,并且尽管在 ECMA 中有斗争,它还是完成了。

ECMAScript 4 的结束出现在 2008 年,Eich 通过一封电子邮件,发送了一次奥斯陆会议的内容提要,详细描述了 ECMAScrpt 走向和版本 3.1 和 4 的未来。

这次会议的结论是:

  1. 与所有各方充分合作,集中精力完成 ES 3.1,到明年初确定两个执行标准。

  2. 下一步上的合作超出 ES3.1,会包含语法上的扩展,但是会在语义和语法创新上比 ES4 更谨慎。

  3. 有些 ES4 提案已经被认为对 Web 不合理,最好不予讨论:包、命名空间和早绑定。这个结论对于 Harmony 来说很关键。

  4. ES4 的其它目标和理念正被改写,以保持在委员会中的一致;包括类的概念是基于已有的 ES3 概念结合提议的 ES3.1 扩展。

总之,ECMAScript 4 花了近 8 年的时间开发,最后却被废弃了。这对涉及的所有人来说都是一个沉重的教训。

单词 "Harmony(和谐)" 出现在上面的结论中。这是将来对 JavaScript 扩展时项目的标准名称。Harmony 会是所有人都同意的方案。在 ECMAScript 3.1 发布后(以版本 5 的形式,下面我们会看到),所有 JavaScript 中要讨论的新主意都会出现在ECMAScript Harmony 中。

ActionScript

ActionScript 是一个基于 ECMAScript 4 早期草案的编程语言。Adobe 将其实现为 Flash 应用程序套件的一部分,也是它支持的唯一的脚本语言。这就让 Adobe 采用强硬的立场来支持 ECMAScript 4,甚至还将他们的引擎(Tamarin)开源发布了,以希望加快 ECMAScript 4 的采纳。Adobe 员工 Mike Chambers 爆光了一个在此事上的有趣看法:

ActionScript 3 没有消失,我们基于最近的决定,没有从中删除任何东西..我们会继续跟踪 ECMAScript 规范,但是正如我们一直所做的那样,我们会创新,尽可能推动 Web 向前发展(正如我们在过去已做过的那样)-Mike Chamber 的博客

ActionScript 开发者期望 ActionScript 中的创新会驱动 ECMAScript 中的特性。不幸的是这事从来没有出现过,而且后来出现在 ECMAScript 2015 中的特性与 ActionScript 在很多方面不兼容。

有人看到这是微软尝试保持控制 ECMAScript 语言和实现的一种策略。此时,唯一可行的 ECMAScript 4 引擎是 Tamarin,所以此时占有 80% 浏览器市场份额的微软可以继续使用它自己的引擎(以及扩展),而不用承担切换到竞争对手的替代品的代价或者花时间内部实现一切。 其他人只是说微软的异议仅仅是技术上的,跟来自 Yahoo 的人一样。Microsoft 的引擎 JScript 此时与其它实现有很多差异。有人已经看到这是保持秘密控制该语言的一种手段。

ActionScript 目前依然是 Flash 的开发语言,而 Flash 随着 HTML5 的到来,逐渐淡出了人们的视野。

如果 ECMAScript 4 已经被流行 JavaScript 引擎实现的话,ActionScript 依然与它最像:

package {
import flash.display.Sprite;
public class MyRectangle_v3 extends Sprite {
private var _outlineWeight:Number;
private var _color:uint;
private var _xLocation:int;
private var _yLocation:int;
private var _rectangleWidth:int;
private var _rectangleHeight:int;

public function MyRectangle_v3(outlineWeight:Number, color:uint,
xLocation:int, yLocation:int,
rectangleWidth:int, rectangleHeight:int) {
_outlineWeight = outlineWeight;
_color = color;
_xLocation = xLocation;
_yLocation = yLocation;
_rectangleWidth = rectangleWidth;
_rectangleHeight = rectangleHeight;
}

public function draw():void{
graphics.lineStyle(_outlineWeight);
graphics.beginFill(_color);
graphics.drawRect(_xLocation, _yLocation, _rectangleWidth, _rectangleHeight);
graphics.endFill();
}
} }

E4X?什么是 E4X?

E4X 是一个公认的 ECMAScript 扩展的名称。它在 ECMAScript 4 开发期间发布(2004年),所以就采用了绰号 E4X。其实际名称是 ECMAScript for XML,并被标准化为 ECMA-357。E4X 扩充了 ECMAScript,以支持对 XML 内容的原生处理和解析。在 E4X 中,XML 被当作是一种原生数据类型。它最初被主流 JavaScript 引擎(比如 SpiderMonkey)采纳,不过之后由于很少有人用而被拿掉。在 Firefox 版本 21 中被删除。

除了其名称中有数字 "4" 之外,E4X 与 ECMAScript 4 没多大关系。

如下是一个使用 E4X 的示例:

var sales =

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部