?
This document uses PHP Chinese website manual Release
JavaScript的誕生
JavaScript的發(fā)布和標(biāo)準(zhǔn)化
ECMAScript和JavaScript的版本
周邊大事記
參考鏈接
理解現(xiàn)在的最好方法之一,就是了解歷史,本節(jié)將全面介紹JavaScript的歷史。了解這些內(nèi)容,還有助于把握J(rèn)avaScript在整個計算機(jī)編程體系和計算機(jī)工業(yè)中所處的位置,以及這門語言涉及的全部內(nèi)容。
JavaScript因為互聯(lián)網(wǎng)而生,緊隨著瀏覽器的出現(xiàn)而問世。回顧它的歷史,就要從瀏覽器的歷史講起。
1990年底,歐洲核能研究組織(CERN)科學(xué)家Tim Berners-Lee,在全世界最大的電腦網(wǎng)絡(luò)——互聯(lián)網(wǎng)的基礎(chǔ)上,發(fā)明了萬維網(wǎng)(World Wide Web),從此可以在網(wǎng)上瀏覽網(wǎng)頁文件。最早的網(wǎng)頁只能在操作系統(tǒng)的終端里瀏覽,也就是說只能使用命令行操作,網(wǎng)頁都是在字符窗口中顯示,這當(dāng)然非常不方便。
1992年底,美國國家超級電腦應(yīng)用中心(NCSA)開始開發(fā)一個獨立的瀏覽器,叫做Mosaic。這是人類歷史上第一個瀏覽器,從此網(wǎng)頁可以在圖形界面的窗口瀏覽。
1994年10月,NCSA的一個主要程序員Marc Andreessen聯(lián)合風(fēng)險投資家Jim Clark,成立了Mosaic通信公司(Mosaic Communications),不久后改名為Netscape。這家公司的方向,就是在Mosaic的基礎(chǔ)上,開發(fā)面向普通用戶的新一代的瀏覽器Netscape Navigator。
1994年12月,Navigator發(fā)布了1.0版,市場份額一舉超過90%。
Netscape公司很快發(fā)現(xiàn),Navigator瀏覽器需要一種可以嵌入網(wǎng)頁的腳本語言,用來控制瀏覽器行為。當(dāng)時,網(wǎng)速很慢而且上網(wǎng)費很貴,有些操作不宜在服務(wù)器端完成。比如,如果用戶忘記填寫“用戶名”,就點了“發(fā)送”按鈕,到服務(wù)器再發(fā)現(xiàn)這一點就有點太晚了,最好能在用戶發(fā)出數(shù)據(jù)之前,就告訴用戶“請?zhí)顚憍x欄”。這就需要在網(wǎng)頁中嵌入小程序,讓瀏覽器檢查每一欄是否都填寫了。
管理層對這種瀏覽器腳本語言的設(shè)想是:功能不需要太強(qiáng),語法較為簡單,容易學(xué)習(xí)和部署。那一年,正逢Java語言開始推向市場,Netscape公司決定,腳本語言的語法要接近Java,并且可以支持Java程序。這些設(shè)想直接排除了使用現(xiàn)存語言,比如perl、python和TCL。
1995年,Netscape公司雇傭了程序員Brendan Eich開發(fā)這種網(wǎng)頁腳本語言。Brendan Eich有很強(qiáng)的函數(shù)式編程背景,希望以Scheme語言(函數(shù)式語言鼻祖LISP語言的一種方言)為藍(lán)本,實現(xiàn)這種新語言。
1995年5月,Brendan Eich只用了10天,就設(shè)計完成了這種語言的第一版。它是一個大雜燴,語法有多個來源:
基本語法:借鑒C語言和Java語言。
數(shù)據(jù)結(jié)構(gòu):借鑒Java語言,包括將值分成原始值和對象兩大類。
函數(shù)的用法:借鑒Scheme語言和Awk語言,將函數(shù)當(dāng)作第一等公民,并引入閉包。
原型繼承模型:借鑒Self語言(Smalltalk的一種變種)。
正則表達(dá)式:借鑒Perl語言。
字符串和數(shù)組處理:借鑒Python語言。
為了保持簡單,這種腳本語言缺少一些關(guān)鍵的功能,比如塊級作用域、模塊、子類型(subtyping)等等,但是可以利用現(xiàn)有功能找出解決辦法。這種功能的不足,直接導(dǎo)致了后來JavaScript的一個顯著特點:對于其他語言,你需要學(xué)習(xí)語言的各種功能,而對于JavaScript,你常常需要學(xué)習(xí)各種解決問題的模式。而且由于來源多樣,從一開始就注定,JavaScript的編程風(fēng)格是函數(shù)式編程和面向?qū)ο缶幊痰囊环N混合體。
Netscape公司的這種瀏覽器腳本語言,最初名字叫做Mocha,1995年9月改為LiveScript。12月,Netscape公司與Sun公司(Java語言的發(fā)明者和所有者)達(dá)成協(xié)議,后者允許將這種語言叫做JavaScript。這樣一來,Netscape公司可以借助Java語言的聲勢,而Sun公司則將自己的影響力擴(kuò)展到了瀏覽器。
之所以起這個名字,并不是因為JavaScript本身與Java語言有多么深的關(guān)系(事實上,兩者關(guān)系并不深),而是因為Netscape公司已經(jīng)決定,使用Java語言開發(fā)網(wǎng)絡(luò)應(yīng)用程序,JavaScript可以像膠水一樣,將各個部分連接起來。當(dāng)然,后來的歷史是Java語言的瀏覽器插件(applet)失敗了,JavaScript反而發(fā)揚(yáng)光大。
1995年12月4日,Netscape公司與Sun公司聯(lián)合發(fā)布了JavaScript語言。值得一提的是,17天之后Ruby語言也發(fā)布了它的第一個版本。
1996年3月,Navigator 2.0瀏覽器正式內(nèi)置了JavaScript腳本語言。
1996年8月,微軟模仿JavaScript開發(fā)了一種相近的語言,取名為JScript(JavaScript是Netscape的注冊商標(biāo),微軟不能用),首先內(nèi)置于IE 3.0。網(wǎng)景公司面臨喪失瀏覽器腳本語言的主導(dǎo)權(quán)的局面。
1996年11月,網(wǎng)景公司決定將JavaScript提交給國際標(biāo)準(zhǔn)化組織ECMA,希望JavaScript能夠成為國際標(biāo)準(zhǔn),以此抵抗微軟。
1997年7月,ECMA組織發(fā)布262號標(biāo)準(zhǔn)文件(ECMA-262)的第一版,規(guī)定了瀏覽器腳本語言的標(biāo)準(zhǔn),并將這種語言稱為ECMAScript。這個版本就是ECMAScript 1.0版。之所以不叫JavaScript,一方面是由于商標(biāo)的關(guān)系,Java是Sun公司的商標(biāo),根據(jù)一份授權(quán)協(xié)議,只有Netscape公司可以合法地使用JavaScript這個名字,且JavaScript已經(jīng)被Netscape公司注冊為商標(biāo),另一方面也是想體現(xiàn)這門語言的制定者是ECMA,不是Netscape,這樣有利于保證這門語言的開放性和中立性。因此,ECMAScript和JavaScript的關(guān)系是,前者是后者的規(guī)格,后者是前者的一種實現(xiàn)。在日常場合,這兩個詞是可以互換的。
1998年6月,ECMAScript 2.0版發(fā)布。
1999年12月,ECMAScript 3.0版發(fā)布,成為JavaScript的通行標(biāo)準(zhǔn),得到了廣泛支持。
2007年10月,ECMAScript 4.0版草案發(fā)布,對3.0版做了大幅升級,預(yù)計次年8月發(fā)布正式版本。草案發(fā)布后,由于4.0版的目標(biāo)過于激進(jìn),各方對于是否通過這個標(biāo)準(zhǔn),發(fā)生了嚴(yán)重分歧。以Yahoo、Microsoft、Google為首的大公司,反對JavaScript的大幅升級,主張小幅改動;以JavaScript創(chuàng)造者Brendan Eich為首的Mozilla公司,則堅持當(dāng)前的草案。
2008年7月,由于對于下一個版本應(yīng)該包括哪些功能,各方分歧太大,爭論過于激進(jìn),ECMA開會決定,中止ECMAScript 4.0的開發(fā),將其中涉及現(xiàn)有功能改善的一小部分,發(fā)布為ECMAScript 3.1,而將其他激進(jìn)的設(shè)想擴(kuò)大范圍,放入以后的版本,由于會議的氣氛,該版本的項目代號起名為Harmony(和諧)。會后不久,ECMAScript 3.1就改名為ECMAScript 5。
2009年12月,ECMAScript 5.0版正式發(fā)布。Harmony項目則一分為二,一些較為可行的設(shè)想定名為Javascript.next繼續(xù)開發(fā),后來演變成ECMAScript 6;一些不是很成熟的設(shè)想,則被視為JavaScript.next.next,在更遠(yuǎn)的將來再考慮推出。
2011年6月,ECMAscript 5.1版發(fā)布,并且成為ISO國際標(biāo)準(zhǔn)(ISO/IEC 16262:2011)。
2013年3月,ECMAScript 6草案凍結(jié),不再添加新功能。新的功能設(shè)想將被放到ECMAScript 7。
2013年12月,ECMAScript 6草案發(fā)布。然后是12個月的討論期,聽取各方反饋。
2014年12月,ECMAScript 6預(yù)計將發(fā)布正式版本。
TC39的總體考慮是,ECMAScript 5與ECMAScript 3基本保持兼容,較大的語法修正和新功能加入,將由JavaScript.next完成。當(dāng)前,JavaScript.next指的是ECMAScript 6,當(dāng)?shù)诹姘l(fā)布以后,將指ECMAScript 7。 TC39預(yù)計,ECMAScript 5會在2013年的年中成為Javascript開發(fā)的主流標(biāo)準(zhǔn),并在今后五年中一直保持這個位置。
雖然ECMAScript是JavaScript的標(biāo)準(zhǔn),但是Netscape公司(以及后來的Mozilla基金會)在內(nèi)部依然使用自己的版本號。這導(dǎo)致了JavaScript有自己不同于ECMAScript的版本號。
1996年3月,Navigator 2.0內(nèi)置了JavaScript 1.0。
1996年8月,Navigator 3.0內(nèi)置了JavaScript 1.1。
1997年6月,Navigator 4.0內(nèi)置了JavaScript 1.2。
1998年10月,Navigator 4.06內(nèi)置了JavaScript 1.3。
1999年,Netscape服務(wù)器版提供JavaScript 1.4。
2000年11月,Navigator 6.0內(nèi)置了JavaScript 1.5。
2005年11月,F(xiàn)irefox 1.5內(nèi)置了JavaScript 1.6。
2006年10月,F(xiàn)irfox 2.0內(nèi)置了JavaScript 1.7。
2008年6月,F(xiàn)irefox 3.0內(nèi)置了JavaScript 1.8。
JavaScript 1.1版對應(yīng)ECMAScript 1.0,但是直到JavaScript 1.4版才完全兼容ECMAScript 1.0。JavaScript 1.5版完全兼容ECMAScript 3.0。目前的JavaScript 1.8版完全兼容ECMAScript 5。
截止2013年初,所有瀏覽器的最新版本——Chrome 24,F(xiàn)irefox 19,IE 10.0,Opera 12,Safari 6——都支持ECMAScript 5.1版。
1996年,樣式表標(biāo)準(zhǔn)CSS第一版發(fā)布。
1997年,DHTML(Dynamic HTML,動態(tài)HTML)發(fā)布,允許動態(tài)改變網(wǎng)頁內(nèi)容。這標(biāo)志著DOM模式(Document Object Model,文檔對象模型)正式應(yīng)用。
1998年,Netscape公司開源了瀏覽器套件,這導(dǎo)致了Mozilla項目的誕生。幾個月后,美國在線(AOL)宣布并購Netscape。
1999年,IE 5部署了XMLHttpRequest接口,允許Javascript發(fā)出HTTP請求,為后來大行其道的Ajax應(yīng)用創(chuàng)造了條件。
2000年,KDE項目重寫了瀏覽器引擎KHTML,為后來的WebKit和Blink引擎打下基礎(chǔ)。這一年的10月23日,KDE 2.0發(fā)布,第一次將KHTML瀏覽器包括其中。
2001年,微軟公司時隔5年之后,發(fā)布了IE瀏覽器的下一個版本Internet Explorer 6。這是當(dāng)時最先進(jìn)的瀏覽器,它后來統(tǒng)治了瀏覽器市場多年。
2001年,Douglas Crockford提出了JSON格式,用于取代XML格式,進(jìn)行服務(wù)器和網(wǎng)頁之間的數(shù)據(jù)交換。JavaScript可以原生支持這種格式,不需要額外部署代碼。
2002年,Mozilla項目發(fā)布了它的瀏覽器的第一版,后來起名為Firefox。
2003年,蘋果公司發(fā)布了Safari瀏覽器的第一版。
2004年,Google公司發(fā)布了Gmail,促成了互聯(lián)網(wǎng)應(yīng)用程序(Web Application)這個概念的誕生。由于Gmail是在4月1日發(fā)布的,很多人起初以為這只是一個玩笑。
2004年,Dojo框架誕生,為不同瀏覽器提供了同一接口,并為主要功能提供了便利的調(diào)用方法。這標(biāo)志著JavaScript編程框架的時代開始來臨。
2004年,WHATWG組織成立,致力于加速HTML語言的標(biāo)準(zhǔn)化進(jìn)程。
2005年,蘋果公司在KHTML引擎基礎(chǔ)上,建立了WebKit引擎。
2005年,Ajax方法(Asynchronous Javascript and XML)正式誕生,Jesse James Garrett發(fā)明了這個詞匯。它開始流行的標(biāo)志是,2月份發(fā)布的Google Maps項目大量采用該方法。它幾乎成了新一代網(wǎng)站的標(biāo)準(zhǔn)做法,促成了Web 2.0時代的來臨。
2005年,Apache基金會發(fā)布了CouchDB數(shù)據(jù)庫。這是一個基于JSON格式的數(shù)據(jù)庫,可以用Javascript函數(shù)定義視圖和索引。它在本質(zhì)上有別于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,標(biāo)識著NoSQL類型的數(shù)據(jù)庫誕生。
2006年,jQuery函數(shù)庫誕生,作者為John Resig。jQuery為操作網(wǎng)頁DOM結(jié)構(gòu)提供了非常強(qiáng)大易用的接口,成為了使用最廣泛的函數(shù)庫,并且讓Javascript語言的應(yīng)用難度大大降低,推動了這種語言的流行。
2006年,微軟公司發(fā)布IE 7,標(biāo)志重新開始啟動瀏覽器的開發(fā)。
2006年,Google推出 Google Web Toolkit 項目(縮寫為GWT),提供Java編譯成JavaScript的功能,開創(chuàng)了將其他語言轉(zhuǎn)為JavaScript的先河。
2007年,Webkit引擎在iPhone手機(jī)中得到部署。它最初基于KDE項目,2003年蘋果公司首先采用,2005年開源。這標(biāo)志著Javascript語言開始能在手機(jī)中使用了,意味著有可能寫出在桌面電腦和手機(jī)中都能使用的程序。
2007年,Douglas Crockford發(fā)表了名為《JavaScript: The good parts》的演講,次年由O'Reilly出版社出版。這標(biāo)志著軟件行業(yè)開始嚴(yán)肅對待JavaScript語言,對它的語法開始重新認(rèn)識,
2008年,V8編譯器誕生。這是Google公司為Chrome瀏覽器而開發(fā)的,它的特點是讓Javascript的運(yùn)行變得非??臁K岣吡薐avaScript的性能,推動了語法的改進(jìn)和標(biāo)準(zhǔn)化,改變外界對JavaScript的不佳印象。同時,V8是開源的,任何人想要一種快速的嵌入式腳本語言,都可以采用V8,這拓展了JavaScript的應(yīng)用領(lǐng)域。
2009年,Node.js項目誕生,創(chuàng)始人為Ryan Dahl,它標(biāo)志著Javascript可以用于服務(wù)器端編程,從此網(wǎng)站的前端和后端可以使用同一種語言開發(fā)。并且,Node.js可以承受很大的并發(fā)流量,使得開發(fā)某些互聯(lián)網(wǎng)大規(guī)模的實時應(yīng)用變得容易。
2009年,Jeremy Ashkenas發(fā)布了CoffeeScript的最初版本。CoffeeScript可以被轉(zhuǎn)化為JavaScript運(yùn)行,但是語法要比JavaScript簡潔。這開啟了其他語言轉(zhuǎn)為JavaScript的風(fēng)潮。
2009年,PhoneGap項目誕生,它將HTML5和JavaScript引入移動設(shè)是備的應(yīng)用程序開發(fā),主要針對iOS和Android平臺,使得JavaScript可以用于跨平臺的應(yīng)用程序開發(fā)。
2010年,三個重要的項目誕生,分別是NPM、BackboneJS和RequireJS,標(biāo)志著JavaScript進(jìn)入模塊化開發(fā)的時代。
2011年,微軟公司發(fā)布Windows 8操作系統(tǒng),將JavaScript作為應(yīng)用程序的開發(fā)語言之一,直接提供系統(tǒng)支持。
2011年,Google發(fā)布了Dart語言,目的是為了結(jié)束JavaScript語言在瀏覽器中的壟斷,提供更合理、更強(qiáng)大的語法和功能。Chromium瀏覽器有內(nèi)置的Dart虛擬機(jī),可以運(yùn)行Dart程序,但Dart程序也可以被編譯成JavaScript程序運(yùn)行。
2011年,微軟工程師Scott Hanselman提出,JavaScript將是互聯(lián)網(wǎng)的匯編語言。因為它無所不在,而且正在變得越來越快。其他語言的程序可以被轉(zhuǎn)成JavaScript語言,然后在瀏覽器中運(yùn)行。
2012年,單頁面應(yīng)用程序框架(single-page app framework)開始崛起,AngularJS項目和Ember項目都發(fā)布了1.0版本。
2012年,微軟發(fā)布TypeScript語言。該語言被設(shè)計成JavaScript的超集,這意味著所有JavaScipt程序,都可以不經(jīng)修改地在TypeScript中運(yùn)行。同時,TypeScript添加了很多新的語法特性,主要目的是為了開發(fā)大型程序,然后還可以被編譯成JavaScript運(yùn)行。
2012年,Mozilla基金會提出asm.js規(guī)格。asm.js是JavaScript的一個子集,所有符合asm.js的程序都可以在瀏覽器中運(yùn)行,它的特殊之處在于語法有嚴(yán)格限定,可以被快速編譯成性能良好的機(jī)器碼。這樣做的目的,是為了給其他語言提供一個編譯規(guī)范,使其可以被編譯成高效的JavaScript代碼。同時,Mozilla基金會還發(fā)起了Emscripten項目,目標(biāo)就是提供一個跨語言的編譯器,能夠?qū)LVM的位代碼(bitcode)轉(zhuǎn)為JavaScript代碼,在瀏覽器中運(yùn)行。因為大部分LLVM位代碼都是從C / C++語言生成的,這意味著C / C++將可以在瀏覽器中運(yùn)行。此外,Mozilla旗下還有LLJS(將JavaScript轉(zhuǎn)為C代碼)項目和River Trail(一個用于多核心處理器的ECMAScript擴(kuò)展)項目。目前,在可以被編譯成JavaScript的語言列表上,共有將近40種語言。
2013年,Mozilla基金會發(fā)布手機(jī)操作系統(tǒng)Firefox OS,該操作系統(tǒng)的整個用戶界面都使用JavaScript。
2013年,ECMA正式推出JSON的國際標(biāo)準(zhǔn),這意味著JSON格式已經(jīng)變得與XML格式一樣重要和正式了。
2014年,微軟推出JavaScript的Windows庫WinJS,標(biāo)志微軟公司全面支持JavaScript與Windows操作系統(tǒng)的融合。
2014年11月,由于對Joyent公司壟斷Node項目、以及該項目進(jìn)展緩慢的不滿,一部分核心開發(fā)者離開了Node.js,創(chuàng)造了io.js項目,這是一個更開放、更新更頻繁的Node.js版本,很短時間內(nèi)就發(fā)布到了2.0版。三個月后,Joyent公司宣布放棄對Node項目的控制,將其轉(zhuǎn)交給新成立的開放性質(zhì)的Node基金會。隨后,io.js項目宣布回歸Node,兩個版本將合并。
2015年3月,F(xiàn)acebook公司發(fā)布了React Native項目,將React框架移植到了手機(jī)端,可以用來開發(fā)手機(jī)App。它會將JavaScript代碼轉(zhuǎn)為iOS平臺的Object-C代碼,或者Android平臺的Java代碼,從而為JavaScript語言開發(fā)高性能的原生App打開了一條道路。
2015年4月,Angular框架宣布,2.0版將基于微軟公司的TypeScript語言開發(fā),這等于為JavaScript語言引入了強(qiáng)類型。
2015年5月,Node模塊管理器npm超越CPAN,標(biāo)志著JavaScript成為世界上軟件模塊最多的語言。
2015年5月,Google公司的Polymer框架發(fā)布1.0版。該項目的目標(biāo)是生產(chǎn)環(huán)境可以使用WebComponent組件,如果能夠達(dá)到目標(biāo),Web開發(fā)將進(jìn)入一個全新的以組件為開發(fā)基礎(chǔ)的階段。
2015年6月,ECMA標(biāo)準(zhǔn)化組織正式批準(zhǔn)了ECMAScript 6語言標(biāo)準(zhǔn),JavaScript語言正式進(jìn)入了下一個階段,成為一種企業(yè)級的、開發(fā)大規(guī)模應(yīng)用的語言。這個標(biāo)準(zhǔn)從提出到批準(zhǔn),歷時10年,而JavaScript語言從誕生至今 也已經(jīng)20年了。
2015年6月,Mozilla在asm.js的基礎(chǔ)上發(fā)布WebAssembly項目。這是一種JavaScript語言編譯后的二進(jìn)制格式,類似于Java的字節(jié)碼,有利于移動設(shè)備加載JavaScript腳本,解析速度提高了20+倍。這意味著將來的軟件,會發(fā)布JavaScript二進(jìn)制包。