- JavaScript語(yǔ)言精髓與編程實(shí)踐(第3版)
- 周愛(ài)民
- 2359字
- 2020-07-02 15:37:32
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)景瀏覽器推出。
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)提升引擎性能。并且從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,這才有了這門(mén)語(yǔ)言中第一個(gè)“標(biāo)準(zhǔn)早于引擎實(shí)現(xiàn)”的版本。
從本書(shū)的第3版開(kāi)始,將完全基于ECMA-262規(guī)范的定義來(lái)講述。但是出于本書(shū)討論方法的需要,我并不嚴(yán)格以該規(guī)范的結(jié)構(gòu)框架來(lái)介紹與分析語(yǔ)言特性。另外,對(duì)于部分特定的語(yǔ)言引擎,本書(shū)將列出不符合上述規(guī)范的實(shí)現(xiàn),并有針對(duì)性地予以討論。
- HornetQ Messaging Developer’s Guide
- 三維圖形化C++趣味編程
- 征服RIA
- SEO實(shí)戰(zhàn)密碼
- Java編程技術(shù)與項(xiàng)目實(shí)戰(zhàn)(第2版)
- 算法訓(xùn)練營(yíng):提高篇(全彩版)
- Python機(jī)器學(xué)習(xí)基礎(chǔ)教程
- Access 2010數(shù)據(jù)庫(kù)應(yīng)用技術(shù)(第2版)
- HTML5+CSS3+JavaScript 從入門(mén)到項(xiàng)目實(shí)踐(超值版)
- iOS開(kāi)發(fā)項(xiàng)目化入門(mén)教程
- Learning Grunt
- NGUI for Unity
- Python網(wǎng)絡(luò)爬蟲(chóng)實(shí)例教程(視頻講解版)
- Neo4j 3.x入門(mén)經(jīng)典
- C#網(wǎng)絡(luò)編程高級(jí)篇之網(wǎng)頁(yè)游戲輔助程序設(shè)計(jì)