1.5 为JavaScript正名
至2005年,JavaScript就已经诞生10年了。然而10年之后,这门语言的发明者Brendan Eich还在向这个世界解释“JavaScript不是Java,也不是脚本化的Java(Java Scription)”。
这实在是计算机语言史上最罕见的一件事了。因为如今几乎所有的Web页面中都同时包含了JavaScript与HTML,而后者从一开始就被人们接受,前者却用了10年都未能向开发人员说清楚“自已是什么”。
Brendan Eich在这份名为“JavaScript这十年(JavaScript at Ten Years)”的演讲稿中,重述了这门语言的早期历史:Brendan Eich自1995年4月受聘于网景公司,开始实现一种名为“魔卡(Mocha)”——JavaScript最早的开发代号或名称的语言;仅两个月之后,为了迎合Netscape的Live战略而更名为LiveScript;到了1995年年末,又为了迎合市场对Java语言的热情,正式地、也是遗憾地更名为JavaScript,并随网景浏览器推出。
Brendan在这篇演讲稿最末一行写道:“不要让营销决定语言名称(Don' t let Marketing name your language)”。一门被误会了10年的语言的名字之争,是不是就此结束了呢?仍然不是。因为这10年来,JavaScript的名字已经越来越乱,更多市场的因素困扰着这门语言,好像“借用Java之名”已经成了扔不掉的黑锅。
1.5.1 JavaScript
我们先说正式的、标准的名词:JavaScript。它实际是指两个东西:
█ 一种语言的统称。该语言由Brendan Eich发明,最早用于Netscape浏览器。
█ 上述语言的一种规范化的实现。在JavaScript 1.3之前,网景公司将他们在Netscape浏览器上的该语言规范的具体实现直接称为JavaScript,并一度以“Client-Side JavaScript”与“Server-Side JavaScript”区分该语言在浏览器NN与NWS(Netscape Web Server)上的实现,但后来他们改变了这个做法。
1.5.2 Core JavaScript
Core JavaScript这个名词早在1996年(或更早之前)就被定义过,但它直到1998年10月由网景公司发布JavaScript 1.3时才被正式提出来。准确地说,它是指由网景公司和后来的开源组织Mozilla,基于Brendan Eich最初版本的JavaScript引擎而发展出来的脚本引擎,是JavaScript规范的一个主要的实现者、继承者和发展者。
Core JavaScript的定义如图1-7所示。
图1-7 官方手册中有关Core JavaScript的概念说明
在JavaScript 1.3发布时,Netscape意识到他们不能仅仅以Client/Server来区分JavaScript,因为市面已经出现了很多种JavaScript。于是他们做了一些小小的改变:在发布手册时,分别发布“Core JavaScript Guide”和“Client-Side JavaScript Guide”。前者是指语言定义与语法规范,后者则是该语言的一种应用环境与应用方法。
所以事实上,自1.3版本开始,Core JavaScript 1.x与JavaScript 1.x是等义的,换言之,我们现在常说的JavaScript 1.x,就是指Core JavaScript,而并不包括Client-Side JavaScript。不过,源于一些历史的因素,在Core JavaScript中会有一部分关于“LiveConnect技术”的叙述及规范。这在其他(所有的)JavaScript规范与实现中均是不具备的。
不幸的是,Apple公司有一个基于KJS实现的JavaScript引擎,名为JavaScriptCore,属于WebKit项目的一个组成部分,WebKit项目所实现的产品就是著名的开源跨平台浏览器Safari。所以在了解Core JavaScript同时,还需强调它与JavaScriptCore的不同。
1.5.3 SpiderMonkey JavaScript
Brendan Eich编写的JavaScript引擎最后由Mozilla贡献给了开源界,SpiderMonkey便是这个产品开发中的、开源项目的名称(code-name,即项目代码名)。为了与我们通常讲述的JavaScript语言区分开来,我们使用SpiderMonkey来特指上述由Netscape实现的、Mozilla和开源社区维护的引擎及其规范。
Mozilla Firefox 4.0以后的版本对SpiderMonkey进行了较大的更新,大量使用JIT(Just In Time)编译技术来提升引擎性能。并且从Firefox 4.0版本开始,Mozilla发布了JavaScript 1.8.5版本,开始支持ES5规范下的语言特性。
在本书此后的描述中,凡称及SpiderMonkey JavaScript的,将是特指于此;凡称及JavaScript的,将是泛指JavaScript这一种语言的实现。
1.5.4 ECMAScript
JavaScript的语言规范由网景公司提交给ECMA去审定,并在1997年6月发布了名为ECMAScript Edition 1的规范,或者称为ECMA-262。4个月后,微软在IE 4.0中发布了JScript 3.0,宣称成为第一个遵循ECMA规范来实现的JavaScript脚本引擎。
而因为计划改写整个浏览器引擎的缘故,网景公司晚了整整一年才推出“完全遵循ECMA规范”的JavaScript 1.3。请注意到这样一个问题:网景公司首先开发了JavaScript并提交ECMA标准化,但在市场的印象中,网景公司的Core JavaScript 1.3比微软的JScript 3.0晚了一年实现ECMA所定义的JavaScript规范。这直接导致了一个恶果:JScript成为JavaScript语言的事实标准。
在本书此后的描述中,我们将基于ECMAScript Ed3的规范来讲述JavaScript。凡未特别指明的叙述中,所谓JavaScript即是指“一种符合ECMAScript Ed3规范的JavaScript实现”。
1.5.5 JScript
微软于1996年在IE中实现了一个与网景浏览器类似的脚本引擎,微软把它叫做JScript以示区别,结果JScript这个名字一直用到现在。
直到JScript 3.0之后,JavaScript语言的局面才显得明朗起来,如图1-8所示。
图1-8 JScript与JavaScript各版本间的关系
由于JScript成为JavaScript语言的事实标准,再有IE浏览器几乎占尽市场(如果我们现在不是在讨论JavaScript,你也可以把这个因果颠倒过来),因此在1999年之后, Web页面上出现的脚本代码基本上都是基于JScript开发的,而Core JavaScript 1.x却变成了“(事实上的)被兼容者”。
直到2005年前后,源于W3C、ECMA对网页内容与脚本语言标准化的推动,以及Mozilla Firefox成功地返回浏览器市场,Web开发人员开始注重所编写的脚本代码是否基于JavaScript的——即是ECMAScript的标准规范,这成为了新一轮语言之争的起点。
1.5.6 总述
JavaScript这个名词的多种含义见表1-2。
表1-2 名词“JavaScript”的多种含义