另一条死路

在 1990 年代中期到后期,人们对软件组件(component)的概念产生了浓厚的兴趣,并提出与实现了几种软件组件模型。这其中包括来自对象管理组织(OMG)的 CORBA、微软的 COM,以及 Sun 的 JavaBeans。一般意义上,软件组件模型是一种模块化方案,提供了一种可以「描述、发现和使用基于对象的软件模块」的方式。在 1997 年 7 月的 TC39 会议上 [1997g],代表 Oracle 的 Jim Tressa 作了有关组件脚本语言的 OMG 提案的介绍。据称在那次会议上,IBM、Netscape、Oracle 和其他公司都有兴趣对基于 ECMAScript 的提案作出回应,但是 OMG 最终制定的规范并非基于 ECMAScript。

「ECMAScript 组件」概念希望发布特定于 JavaScript 的组件模型,以便在浏览器和其他 JavaScript 宿主中使用。它定义了一份 XML 模式(schema)和词汇表,以描述 JavaScript 组件和一组实现者应遵守的约定。这项工作的赞助者是 NetObjects59 和 Netscape 这两家公司。NetObjects 的 Richard Wagner [1998] 于 1998 年 6 月向 Ecma GA 大会进行了初步介绍。在同一次会议上,相应的技术规范草案 [Wagner and Shapley 1998] 被提交给了 TC39。这份文档经过了三份草案的修改,然后提交给了 Ecma GA。它被批准为 Ecma 标准,并发布为了 ECMA-290 [Wagner 1999]。然而根据记录,这份标准并没有被实际实现过。根据 TC39 的建议,Ecma GA 大会在 2009 年投票决定撤回 ECMA-290 标准 [Ecma International 2009b]。

ECMAScript 第三版中的「精简模式(compact profile)项目」为 ES3 的一个动态程度较低的子集定义出了一种语言模式g,这可以使得资源受限环境中的 JavaScript 实现仍然符合 ECMAScript 规范。这一规范的创建 [Raggett 2000] 是由 Ecma 之外的 WMLScript 推动的,目标是定义用于手机应用60的 JavaScript 方言 [Lewis 1999b]。精简模式包含了 ES3 的所有特性,但允许实现移除对 with 语句的支持。实现也可以移除对 evalFunction 构造函数的支持。精简模式还支持让内置库的对象不可变的实现,这样可以进行预编译,或提供基于 ROM 的实现。Ecma GA 大会批准了 ECMA-327 精简模式标准 [Vartiainen 2001]。与 ECMA-290 不同的是,ECMA-327 实际上已经在某些环境中实现了。但是随着新版 ECMA-262 的发布,人们对更新 ECMA-327 缺乏兴趣。ECMA-262 的最新版本已经使用在了资源非常受限的环境上。如果针对这类环境的实现需要移除某些特性,直接做就是了。实际上对于大多数资源受限的应用而言,并没有证据表明实现之间需要具备完美的 JavaScript 互操作性。Ecma GA 大会在 2015 年投票决定撤回 ECMA-327 标准 [Ecma International 2015b]。

在 2002 年,TC39-TG1 将大部分注意力转移到了开发「ECMAScript for XML」的规范上。所谓 E4X 是一个单独的 Ecma 标准,它向 ES3 添加了语法扩展,从而支持对 XML 文档的处理。相应的 ECMA-357 版本 [Ecma International 2004; Scheneider et al. 2005] 分别于 2004 年和 2005 年发布。Firefox 是唯一实现 E4X 的浏览器,因此就像浏览器博弈论中指出的那样,这个能力很少被使用。到了 2015 年,由于 E4X 扩展与 ECMAScript 2015 不兼容,ECMA-357 这项 Ecma 标准也被撤回 [Ecma International 2015b]。