代码改变世界

为什么ECMAScript 5不是ECMAScript 4

2010-08-24 10:56  Nana's Lich  阅读(5819)  评论(8编辑  收藏  举报

当发现ECMAScript 4被取消,ECMAScript 3.1和ECMAScript 5取而代之的消息的时候,我觉得很惊讶。

我估计世界上肯定还有其它的人跟我一样经验,而且数量并不少。

 

刚开始见到ECMAScript 4的草案的时候我简直要被它迷住了,哎呀呀呀,class,extends,namespace,package哎呀呀呀,我的眼睛都要花了,有些JavaScript高手也对ECMAScript 4的前景进行了美好的展望—— 

但是嘎嘣一下子,ECMAScript 4就没了——好吧,其实根据有心人的观察,在取消ECMAScript 4之前争议已经有了将近一年了,还有人颇为气愤地表示“在微软的压迫下技术大牛们只好委屈地接受了ECMAScript 3.1”什么什么的……

 

然而当时的事情真的只是“微软施压”吗?

 

  • class?
    ECMAScript中可以用函数(function)作为对象的构造器(constructor),配合原型(prototype)对对象进行初始化。
  • extends?
    继承也是ECMAScript与生俱来的能力——虽然它长得有点奇怪,来自Yahoo!的Douglas Crockford不得不专门写文来解释JavaScript中继承的实现原理
  • namespace?
    由于构造器的引用本身可以被当作值赋予给变量或者属性,所以随便找个什么对象都可以当namespace用。
  • package?
    加载的方式要用什么样的方式来实现呢?

 

想要使用像上面的这些ECMAScript 4特性,就必须要使用一些新的语法,不仅脑袋里要记一些其实根本没多大意义的关键字和语法结构,使用新特性的代码也没法跟旧的ECMAScript 3兼容——具体上说,ECMAScript基本上是不会编译执行的,无论是在网页上还是在其它类型的执行环境中,ECMAScript代码都要以源代码的形式来提供,这也就表示如果在一个支持ECMAScript 3的执行环境中放入使用了上面这些ECMAScript 4的新特性的代码,不仅代码不能正确执行,而且会由于无法分析的语法特征引发语法错误,连捕捉并work around的机会都没有!

 

当然了,ECMAScript 4的草案中还是有些颇有意义的特性的,比方说:

  • Object.Freeze,让一个对象不可被修改,这个已经在ECMAScript 5中实现了(貌似ECMAScript 3.1中也有);
  • 对访问器的定义,ECMAScript 5中用defineProperty实现了(貌似ECMAScript 3.1中也有相似的功能,但略有区别);
  • 不可变类型,ECMAScript 5中有Object.preventExtensions和Object.seal;

 



虽然一时间我没有办法很完整地列出这种对应的关系,但如今我们已经很容易看出——ECMAScript 4草案中大部分有实际效果的新特性,都在ECMAScript 3.1和ECMAScript 5中在兼容于ECMAScript 3的语法的前提下提供了,秉承了ECMAScript容易扩展和“用到再说”的优良传统,保持了ECMAScript一贯的灵活性。

 

 

至于所谓的“大牛们只好委屈”到底是怎么回事呢?

  • Douglas Crockford是不是大牛?
    到ECMAScript 4取消的时候这位老鬼写了JavaScript十余年,发明了JSON、JSLint、JSMin等有用的工具,现在也是YUI及其配套组件的主力开发人员。
    道格拉斯老鬼是这样说的:“很多人都觉得JavaScript烂,并且希望新语言能少烂一点。我的担心是它可能更烂。一门新语言如果能证明自己,就会被人接受。但在它得到证明以前,不应该就先标准化并用以取代稳定的旧技术。”
  • Dave Thomas是不是大牛?
    这位IBM的语言研究人员是这样说的:“单单浏览一下Wiki我已经可以看到这个语言包含prototype、类、multi-method(?)、静态类型、动态类型,等等等等。这让我这个老头子想起了其他由委员会设计出来的大型语言,像PL/I、Algol 68和ADA。这些雄心勃勃的语言无论设计还是实现都集中了一帮子聪明人,但不幸都搞得太复杂,面世也太晚。JS是要给一般人用的语言,不是什么只有技术天才才能理解的语言。如果你是一个Ajax开发者并且关心动态语言的发展,我觉得你是时候站出来发表意见了,去帮助ECMAScript 4转向一条不那么好高骛远的路径。对语言来说,小才是真好。”

 

而在当时支持ECMAScript 4的都有谁呢?

我能查到的带头的有Adobe、Google、Mozilla、Opera,我们来看看这几个带头的机构/团队实际上是怎么一回事:

  • Adobe:希望在Flash/Flex的虚拟机中(也可能还有其它Adobe产品,但是本质上是差不多的)使用编译的脚本语言,希望给ActionScript一个看上去名正言顺的“规范的”身份——实际上在Adobe的文档中ActionScript的边界还有点模糊,在普遍的理解方式中Flash/Flex的类库也是包含在ActionScript中的;而ECMAScript只定义核心的语言功能和对象,API方面的事归DOM或者别的什么上下文环境去管。
  • Google:后来我们知道了Google有在Web上发展高级应用的意图,Google或许是这里面唯一一个没有什么见鬼的意图的一员。
  • Mozilla:作为JavaScript的官方维护者,Mozilla一直试图领导ECMAScript的发展——虽然现在Mozilla已经变成了开源项目基金,旗下的开源项目由无数热心的贡献者来维护和提升,但千万不要忘了:Mozilla是在一系列的失败决策之后才不得不转向开源的,而不是一开始就想这样;JavaScript最初也只是Netscape的私有物,“JavaScript”甚至还是Sun(现在Oracle)的注册商标,出于推广策略方面的考虑才特意借用“Java”的名头。
    ECMAScript 4草案定制的过程中,JavaScript 2的草案也在定制,Mozilla,尤其是JavaScript的创造者。
    这样的做法不得不让我怀疑他们有意混淆JavaScript和ECMAScript的“标准”身份——实际上到现在为止官方的JavaScript也在不断添加各种有的没的的新语言功能,这些大部分都是和ECMAScript不兼容的,所谓“支持JavaScript”的浏览器也大部分不能支持这类新特性,它们共通的部分只有“JavaScript中属于ECMAScript 3/3.1/5的那部分”,换句话说,其它浏览器支持的还是“ECMAScript”,而不是“JavaScript”。
  • Opera:这个宣称自己最友好、最快、最标准的浏览器,其实在DOM模型和ECMAScript 3的支持上总是存在一些问题——不要觉得惊讶,有些时候甚至在IE和Firefox、Google Chrome、Safari之间能通用的东西,唯独放在Opera这里会出问题——比方说对call和caller的处理有问题(通过call/apply调用一个函数的时候在目标函数内访问caller得到的是call/apply,当时存在这个问题,现在修正了)、String.prototype.replace的第二个参数如果是函数则可能处理不正常如果替换函数不返回任何东西,其它浏览器会假定返回空字符串,而Opera会把“undefined”替换进去——在后来的测试中发现其它浏览器也会如此,只有IE是例外,但之前的测试为什么会得到这样的结果还没有弄清楚)、(抱歉关于DOM的例子我想不起来了,日子有点久)。

 

从上面几个例子很容易看出,当时支持ECMAScript 4的集团大部分(不是全部,有例外)都是打着各自的小算盘。我在这里恶意地假设这个“大部分”的目的只是想假“标准”的名义添加上一大堆东西,好在日后方便宣传自己“更加标准”,而根本不是在关心怎么真正地帮助Web开发人员。很多新特性,看起来很美,但是很遗憾,它们不是JavaScript或者ECMAScript思想下的产物,它们只是一帮好高骛远的架构太空人的馊主意,对实际开发不仅没帮助,反而要增添一大堆问题。

 

如果你是一名.NET开发人员,也曾经受蛊惑使用过JScript.NET,那么你就该知道那些ECMAScript 4的特性用起来有多么讨厌了——你会感觉到你是在使用Java的一种变体,一切繁琐的事情都来了,你找不到记忆中的那种编写JavaScript代码的乐趣。当然了,在那段时间里我也诅咒过Visual Studio,因为它不能识别ECMAScript 4的语法……不过ECMAScript 4已经被取消了,我就只好责怪自己选错了工具了。

 

别觉得是微软搞垮了ECMAScript 4,微软不是没支持过ECMAScript 4,但是它真的太难用了——即使只是在编译执行环境中。

也别觉得ECMAScript 4垮掉是坏事,可以work around的ECMAScript 5要比不知道要观望多久才能实际应用的ECMAScript 4实在得多。

 

而ECMAScript 4的取消其实对当初那些大力支持ECMAScript 4的机构/团队也没什么实质的影响:

  • ActionScript并不会因为ECMAScript 4垮掉就消失;
  • JavaScript的官方版本也还在不断添加新功能(只不过在经ECMA标准化之后它就不能再像刚开始那样引领Web标准走向了)。

不用被其它ECMAScript实现的步调约束它们反而发展得更好。

 

当然它们还是想要个名分——你看,ECMAScript 4取消了之后,不是又有了一个“ECMAScript Harmony”吗?

 

 

后记:

虽然在ECMAScript标准定制的问题上我不怎么喜欢Mozilla和Opera,但Firefox和Opera都是很棒的浏览器——对于那些对电脑了解得比较多的人,Firefox无疑是个好选择;而对于一般的电脑用户,我也推荐Opera,它的设计理念相当不错。

如果不喜欢Opera,Google Chrome是一款相对纯粹的浏览器软件,在这个浏览器越来越复杂的年代,Google Chrome这种返璞归真也不失为一种特色。