为什么ECMAScript 5不是ECMAScript 4
2010-08-24 10:56 Nana's Lich 阅读(5826) 评论(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这种返璞归真也不失为一种特色。