官术网_书友最值得收藏!

1.6 為JavaScript正名

到2005年,JavaScript就已經(jīng)誕生十年了。然而十年之后,這門(mén)語(yǔ)言的發(fā)明者Brendan Eich還在向這個(gè)世界解釋“JavaScript不是Java,也不是腳本化的Java(Java Scription)”。

這實(shí)在是計(jì)算機(jī)語(yǔ)言史上罕見(jiàn)的一件事了。因?yàn)槿缃駧缀跛械腤eb頁(yè)面中都同時(shí)包含了JavaScript與HTML,而后者從一開(kāi)始就被人們接受,前者卻用了十年都未能向開(kāi)發(fā)人員說(shuō)清楚“自己是什么”。

Brendan Eich在這份名為《JavaScript這十年》(JavaScript at Ten Years)的演講稿中,重述了這門(mén)語(yǔ)言的早期發(fā)展歷史:Brendan Eich自1995年4月受聘于網(wǎng)景公司,開(kāi)始實(shí)現(xiàn)一種名為“魔卡(Mocha)”—JavaScript最早的開(kāi)發(fā)代號(hào)或名稱(chēng)—的語(yǔ)言;僅兩個(gè)月之后,為了迎合Netscape的Live戰(zhàn)略而更名為L(zhǎng)iveScript;到了1995年年末,又為了迎合市場(chǎng)對(duì)Java語(yǔ)言的熱情,正式地、也是遺憾地更名為JavaScript,并隨網(wǎng)景瀏覽器推出。部分信息引自以下文獻(xiàn):The History of JavaScript以及JavaScript Tutorial Part I。

Brendan在這篇演講稿最末一行寫(xiě)道:“不要讓營(yíng)銷(xiāo)決定語(yǔ)言名稱(chēng)(Don't let Marketing name your language)”。一門(mén)被誤會(huì)了十年的語(yǔ)言的名字之爭(zhēng),是不是就此結(jié)束了呢?

仍然不是。因?yàn)檫@十年來(lái),JavaScript的名字已經(jīng)越來(lái)越亂,更多市場(chǎng)的因素困擾著這門(mén)語(yǔ)言—好像“借用Java之名”已經(jīng)成了扔不掉的黑鍋。

1.6.1 JavaScript

我們先說(shuō)正式的、標(biāo)準(zhǔn)的名詞:JavaScript。它實(shí)際是指兩項(xiàng)內(nèi)容:

■ 一種語(yǔ)言的統(tǒng)稱(chēng),該語(yǔ)言由Brendan Eich發(fā)明,最早用于Netscape瀏覽器。

■ 上述語(yǔ)言的一種規(guī)范化的實(shí)現(xiàn)。

在JavaScript 1.3之前,網(wǎng)景公司將它們?cè)贜etscape瀏覽器上的該語(yǔ)言規(guī)范的具體實(shí)現(xiàn)直接稱(chēng)為JavaScript,并一度以Client-Side JavaScript與Server-Side JavaScript區(qū)分該語(yǔ)言在瀏覽器NN(Netscape Navigator)與NWS(Netscape Web Server)上的實(shí)現(xiàn)—但后來(lái)它們改變了這個(gè)做法。而在JavaScript 1.3之后,我們?cè)诹?xí)慣上只采用上述的第二種說(shuō)法:將所有這門(mén)語(yǔ)言的實(shí)現(xiàn)都稱(chēng)為JavaScript,而不再特指網(wǎng)景(以及后來(lái)的Mozilla)的。

然而在ECMAScript開(kāi)始制定規(guī)范之后,這些實(shí)現(xiàn)又被統(tǒng)稱(chēng)為“基于ECMAScript標(biāo)準(zhǔn)的實(shí)現(xiàn)”,或者“ECMAScript的方言”。因此現(xiàn)在確切的說(shuō)法是:

■ JavaScript是一種語(yǔ)言的統(tǒng)稱(chēng),由ECMAScript-262規(guī)范來(lái)定義。

■ JavaScript包含了Core JavaScript、SpiderMonkey JavaScript、JScript等各種宣稱(chēng)自己實(shí)現(xiàn)了ECMAScript規(guī)范的引擎與語(yǔ)言(及其擴(kuò)展),而非特指其一。

1.6.1.1 Core JavaScript

Core JavaScript這個(gè)名詞早在1996年(或更早之前)就被定義過(guò),但它直到1998年10月由網(wǎng)景公司發(fā)布JavaScript 1.3時(shí)才被正式提出來(lái)。準(zhǔn)確地說(shuō),它是指由網(wǎng)景公司和后來(lái)的開(kāi)源組織Mozilla,基于Brendan Eich最初版本的JavaScript引擎而發(fā)展出來(lái)的腳本引擎,是JavaScript規(guī)范的一個(gè)主要的實(shí)現(xiàn)者、繼承者和發(fā)展者。

Core JavaScript的定義如圖1-7所示。

圖1-7 官方手冊(cè)中有關(guān)Core JavaScript的概念說(shuō)明

由于Netscape是早期網(wǎng)頁(yè)瀏覽器的事實(shí)標(biāo)準(zhǔn)的制定者,因此那個(gè)時(shí)代的“Client-Side JavaScript”也就定義了所謂的“瀏覽器端JavaScript”的早期模型。這包括DOM、BOM模型等在內(nèi)、沿用至今的對(duì)象體系和事件方法,并且也是目前JavaScript應(yīng)用最為廣泛的環(huán)境。

但到了JavaScript 1.3發(fā)布時(shí),Netscape便意識(shí)到它們不能僅僅以Client/Server來(lái)區(qū)分JavaScript—因?yàn)槭忻嫔铣霈F(xiàn)了多種JavaScript。于是它們做了一些小小的改變:在發(fā)布手冊(cè)時(shí),分別發(fā)布“Core JavaScript Guide”和“Client-Side JavaScript Guide”。前者是語(yǔ)言定義與語(yǔ)法規(guī)范,后者則是該語(yǔ)言的一種應(yīng)用環(huán)境與應(yīng)用方法。

所以事實(shí)上,對(duì)于Mozilla來(lái)說(shuō),自JavaScript 1.3版本開(kāi)始,Core JavaScript 1.x與JavaScript 1.x是等義的。在這種語(yǔ)境下所說(shuō)的JavaScript 1.x,就是指Core JavaScript,而并不包括Client-Side JavaScript。不過(guò),由于一些歷史原因,在Core JavaScript中會(huì)有一部分關(guān)于“LiveConnect技術(shù)”的敘述及規(guī)范。這在其他(所有的)JavaScript規(guī)范與實(shí)現(xiàn)中均是不具備的。

然而不幸的是,Apple公司有一個(gè)基于KJS實(shí)現(xiàn)的JavaScript引擎,名為JavaScriptCore,屬于WebKit項(xiàng)目的一個(gè)組成部分—WebKit項(xiàng)目所實(shí)現(xiàn)的產(chǎn)品就是著名的開(kāi)源跨平臺(tái)瀏覽器Safari。所以在了解Core JavaScript的同時(shí),還需強(qiáng)調(diào)它與JavaScriptCore的不同。

1.6.1.2 SpiderMonkey JavaScript

Brendan Eich編寫(xiě)的JavaScript引擎最后由Mozilla貢獻(xiàn)給了開(kāi)源界,SpiderMonkey便是這個(gè)產(chǎn)品開(kāi)發(fā)中的開(kāi)源項(xiàng)目的名稱(chēng)(code-name,項(xiàng)目代碼名)。為了與通常講述的JavaScript語(yǔ)言區(qū)分開(kāi)來(lái),我們使用SpiderMonkey來(lái)特指上述由Netscape實(shí)現(xiàn)的、Mozilla和開(kāi)源社區(qū)維護(hù)的引擎及其規(guī)范。

Mozilla Firefox 4.0以后的版本對(duì)SpiderMonkey JavaScript進(jìn)行了較大的更新,大量使用JIT(Just In Time)編譯技術(shù)來(lái)提升引擎性能。事實(shí)上,在Firefox 3.5中便開(kāi)始加入JIT編譯引擎,這使得從Firefox 4.0版本開(kāi)始,SpiderMonkey總是同時(shí)帶有兩套JIT引擎—分別稱(chēng)為T(mén)raceMonkey和JaegerMonkey—來(lái)做執(zhí)行期的優(yōu)化。而在Firefox 18之后的版本中,采用了第三套JIT引擎,即IonMonkey,TraceMoneky被移除。到2013年4月,F(xiàn)irefox中又加入了一個(gè)用于平衡Jaeger和Ion的新的JIT,稱(chēng)為Baseline。更為不幸的是,這一切還在變化之中,例如,F(xiàn)irefox 22中加入的用于優(yōu)化asm.js的OdinMoneky。并且從Firefox 4.0版本開(kāi)始,Mozilla發(fā)布了JavaScript 1.8.5版本,開(kāi)始支持ECMAScript規(guī)范下最新的語(yǔ)言特性。

在本書(shū)此后的描述中,凡稱(chēng)及SpiderMonkey JavaScript的,將是特指由Mozilla發(fā)布的這一引擎;凡稱(chēng)及JavaScript的,將是泛指JavaScript這一種語(yǔ)言的實(shí)現(xiàn)。

1.6.1.3 JScript

微軟于1996年在IE中實(shí)現(xiàn)了一個(gè)與網(wǎng)景瀏覽器類(lèi)似的腳本引擎,微軟把它叫作JScript以示區(qū)別,結(jié)果JScript這個(gè)名字一直用到現(xiàn)在。Internet Explorer瀏覽器在那個(gè)時(shí)候幾乎占盡市場(chǎng),因此在1999年之后,Web頁(yè)面上出現(xiàn)的腳本代碼基本上都是基于JScript開(kāi)發(fā)的,而Core JavaScript 1.x卻變成了“(事實(shí)上的)被兼容者”。

直到2005年前后,源于W3C、ECMA對(duì)網(wǎng)頁(yè)內(nèi)容與腳本語(yǔ)言標(biāo)準(zhǔn)化的推動(dòng),以及Mozilla Firefox成功地返回瀏覽器市場(chǎng),Web開(kāi)發(fā)人員開(kāi)始注重所編寫(xiě)的腳本代碼是否基于JavaScript的標(biāo)準(zhǔn)—ECMAScript規(guī)范,這成為新一輪語(yǔ)言之爭(zhēng)的起點(diǎn)。

現(xiàn)在的微軟瀏覽器(Microsoft Edge)中已經(jīng)啟用了稱(chēng)為Chakra的新引擎,因此JScript只用于特指Internet Explorer系列的瀏覽器環(huán)境中內(nèi)置的JavaScript引擎。不過(guò),另外在Windows Script Host(WSH)、Active Server Page(ASP)等腳本開(kāi)發(fā)環(huán)境中也包括JScript這一語(yǔ)言的實(shí)現(xiàn),某些環(huán)境下它們也被稱(chēng)為ActiveScript。

1.6.2 ECMAScript

JavaScript的語(yǔ)言規(guī)范由網(wǎng)景公司提交給ECMA(European Computer Manufacturers Association,歐洲計(jì)算機(jī)制造協(xié)會(huì))去審定,并在1997年6月發(fā)布了名為ECMAScript Edition 1的規(guī)范,或者稱(chēng)為ECMA-262。4個(gè)月后,微軟在IE 4.0中發(fā)布了JScript 3.0,宣稱(chēng)成為第一個(gè)遵循ECMAScript規(guī)范實(shí)現(xiàn)的JavaScript腳本引擎。而因?yàn)橛?jì)劃改寫(xiě)整個(gè)瀏覽器引擎的緣故,網(wǎng)景公司整整晚了一年才推出“完全遵循ECMAScript規(guī)范”的JavaScript 1.3。

請(qǐng)注意到這樣一個(gè)事實(shí):網(wǎng)景公司首先開(kāi)發(fā)了JavaScript并提交給ECMA進(jìn)行標(biāo)準(zhǔn)化,但在市場(chǎng)的印象中,網(wǎng)景公司的Core JavaScript 1.3比微軟的JScript 3.0“晚了一年”實(shí)現(xiàn)ECMA所定義的JavaScript規(guī)范。這直接導(dǎo)致了一個(gè)惡果:在ECMAScript Edition 3(ES3)發(fā)布的早期,JScript成為JavaScript語(yǔ)言的事實(shí)標(biāo)準(zhǔn)。這個(gè)局面一直到JScript 3.0以及SpiderMonkey JavaScript 1.5之后才明朗起來(lái),如圖1-8所示。

圖1-8 JScript與JavaScript各版本之間的關(guān)系

由于兩家主要的JavaScript早期實(shí)現(xiàn)者已經(jīng)基于ES3達(dá)成了一致,因此隨后的入局者—Google,在Chrome上實(shí)現(xiàn)的V8引擎也只得先遵循這一版本的規(guī)范。再后來(lái),直到2015年,ECMA-262標(biāo)準(zhǔn)委員會(huì)終于發(fā)布了ECMAScript Edition 6,即ES6或ES2015從2015年開(kāi)始,ECMA-262標(biāo)準(zhǔn)委員會(huì)每年發(fā)布一個(gè)新版本的規(guī)范,因此不再沿用舊的ES1~5的命名,而采用ES2015~ES20xx這樣的命名風(fēng)格。ES6因此成為最后一個(gè)舊命名,并通常與ES2015混用,指代同一個(gè)版本。目前,ES-Placeholder已經(jīng)在GitHub上占據(jù)了從ES2019~ES2022的全部倉(cāng)庫(kù)名,但這并不意味著將來(lái)一定會(huì)有這么多個(gè)ECMAScript版本的發(fā)布。,這才有了這門(mén)語(yǔ)言中第一個(gè)“標(biāo)準(zhǔn)早于引擎實(shí)現(xiàn)”的版本。

從本書(shū)的第3版開(kāi)始在本書(shū)的第1版和第2版中,主要基于ECMAScript Edition 3的規(guī)范來(lái)講述JavaScript,但并沒(méi)有完全遵循該規(guī)范的定義。本書(shū)的當(dāng)前版本(第3版)則是基于已發(fā)布的ES2015~ES2019來(lái)撰寫(xiě)的。,將完全基于ECMA-262規(guī)范的定義來(lái)講述。但是出于本書(shū)討論方法的需要,我并不嚴(yán)格以該規(guī)范的結(jié)構(gòu)框架來(lái)介紹與分析語(yǔ)言特性。另外,對(duì)于部分特定的語(yǔ)言引擎,本書(shū)將列出不符合上述規(guī)范的實(shí)現(xiàn),并有針對(duì)性地予以討論。

主站蜘蛛池模板: 盘锦市| 广汉市| 兴宁市| 伊宁市| 社旗县| 香港 | 印江| 安康市| 宁津县| 西和县| 宁蒗| 吐鲁番市| 阜阳市| 清新县| 邢台县| 新安县| 平果县| 康定县| 赤城县| 县级市| 普陀区| 枣庄市| 石渠县| 阿合奇县| 丰台区| 涞水县| 康平县| 伊川县| 平谷区| 涪陵区| 灌南县| 普宁市| 定南县| 博爱县| 西林县| 大丰市| 札达县| 德阳市| 色达县| 临夏县| 齐河县|