[TOC]
理解現在的最好方法之一,就是了解歷史,本節將全面介紹JavaScript的歷史。了解這些內容,還有助于把握JavaScript在整個計算機編程體系和計算機工業中所處的位置,以及這門語言涉及的全部內容。
## JavaScript的誕生
JavaScript因為互聯網而生,緊隨著瀏覽器的出現而問世。回顧它的歷史,就要從瀏覽器的歷史講起。
1990年底,歐洲核能研究組織(CERN)科學家Tim Berners-Lee,在全世界最大的電腦網絡——互聯網的基礎上,發明了萬維網(World Wide Web),從此可以在網上瀏覽網頁文件。最早的網頁只能在操作系統的終端里瀏覽,也就是說只能使用命令行操作,網頁都是在字符窗口中顯示,這當然非常不方便。
1992年底,美國國家超級電腦應用中心(NCSA)開始開發一個獨立的瀏覽器,叫做Mosaic。這是人類歷史上第一個瀏覽器,從此網頁可以在圖形界面的窗口瀏覽。
1994年10月,NCSA的一個主要程序員Marc Andreessen聯合風險投資家Jim Clark,成立了Mosaic通信公司(Mosaic Communications),不久后改名為Netscape。這家公司的方向,就是在Mosaic的基礎上,開發面向普通用戶的新一代的瀏覽器Netscape Navigator。
1994年12月,Navigator發布了1.0版,市場份額一舉超過90%。
Netscape公司很快發現,Navigator瀏覽器需要一種可以嵌入網頁的腳本語言,用來控制瀏覽器行為。當時,網速很慢而且上網費很貴,有些操作不宜在服務器端完成。比如,如果用戶忘記填寫“用戶名”,就點了“發送”按鈕,到服務器再發現這一點就有點太晚了,最好能在用戶發出數據之前,就告訴用戶“請填寫xx欄”。這就需要在網頁中嵌入小程序,讓瀏覽器檢查每一欄是否都填寫了。
管理層對這種瀏覽器腳本語言的設想是:功能不需要太強,語法較為簡單,容易學習和部署。那一年,正逢Java語言開始推向市場,Netscape公司決定,腳本語言的語法要接近Java,并且可以支持Java程序。這些設想直接排除了使用現存語言,比如perl、python和TCL。
1995年,Netscape公司雇傭了程序員Brendan Eich開發這種網頁腳本語言。Brendan Eich有很強的函數式編程背景,希望以Scheme語言(函數式語言鼻祖LISP語言的一種方言)為藍本,實現這種新語言。
1995年5月,Brendan Eich只用了10天,就設計完成了這種語言的第一版。它是一個大雜燴,語法有多個來源:
* 基本語法:借鑒C語言和Java語言。
* 數據結構:借鑒Java語言,包括將值分成原始值和對象兩大類。
* 函數的用法:借鑒Scheme語言和Awk語言,將函數當作第一等公民,并引入閉包。
* 原型繼承模型:借鑒Self語言(Smalltalk的一種變種)。
* 正則表達式:借鑒Perl語言。
* 字符串和數組處理:借鑒Python語言。
為了保持簡單,這種腳本語言缺少一些關鍵的功能,比如塊級作用域、模塊、子類型(subtyping)等等,但是可以利用現有功能找出解決辦法。這種功能的不足,直接導致了后來JavaScript的一個顯著特點:對于其他語言,你需要學習語言的各種功能,而對于JavaScript,你常常需要學習各種解決問題的模式。而且由于來源多樣,從一開始就注定,JavaScript的編程風格是函數式編程和面向對象編程的一種混合體。
Netscape公司的這種瀏覽器腳本語言,最初名字叫做Mocha,1995年9月改為LiveScript。12月,Netscape公司與Sun公司(Java語言的發明者和所有者)達成協議,后者允許將這種語言叫做JavaScript。這樣一來,Netscape公司可以借助Java語言的聲勢,而Sun公司則將自己的影響力擴展到了瀏覽器。
之所以起這個名字,并不是因為JavaScript本身與Java語言有多么深的關系(事實上,兩者關系并不深),而是因為Netscape公司已經決定,使用Java語言開發網絡應用程序,JavaScript可以像膠水一樣,將各個部分連接起來。當然,后來的歷史是Java語言的瀏覽器插件(applet)失敗了,JavaScript反而發揚光大。
## JavaScript的發布和標準化
1995年12月4日,Netscape公司與Sun公司聯合發布了JavaScript語言。值得一提的是,17天之后Ruby語言也發布了它的第一個版本。
1996年3月,Navigator 2.0瀏覽器正式內置了JavaScript腳本語言。
1996年8月,微軟模仿JavaScript開發了一種相近的語言,取名為JScript(JavaScript是Netscape的注冊商標,微軟不能用),首先內置于IE 3.0。網景公司面臨喪失瀏覽器腳本語言的主導權的局面。
1996年11月,網景公司決定將JavaScript提交給國際標準化組織ECMA,希望JavaScript能夠成為國際標準,以此抵抗微軟。
1997年7月,ECMA組織發布262號標準文件(ECMA-262)的第一版,規定了瀏覽器腳本語言的標準,并將這種語言稱為ECMAScript。這個版本就是ECMAScript 1.0版。之所以不叫JavaScript,一方面是由于商標的關系,Java是Sun公司的商標,根據一份授權協議,只有Netscape公司可以合法地使用JavaScript這個名字,且JavaScript已經被Netscape公司注冊為商標,另一方面也是想體現這門語言的制定者是ECMA,不是Netscape,這樣有利于保證這門語言的開放性和中立性。因此,ECMAScript和JavaScript的關系是,前者是后者的規格,后者是前者的一種實現。在日常場合,這兩個詞是可以互換的。
1998年6月,ECMAScript 2.0版發布。
1999年12月,ECMAScript 3.0版發布,成為JavaScript的通行標準,得到了廣泛支持。
## ECMAScript和JavaScript的版本
2007年10月,ECMAScript 4.0版草案發布,對3.0版做了大幅升級,預計次年8月發布正式版本。草案發布后,由于4.0版的目標過于激進,各方對于是否通過這個標準,發生了嚴重分歧。以Yahoo、Microsoft、Google為首的大公司,反對JavaScript的大幅升級,主張小幅改動;以JavaScript創造者Brendan Eich為首的Mozilla公司,則堅持當前的草案。
2008年7月,由于對于下一個版本應該包括哪些功能,各方分歧太大,爭論過于激進,ECMA開會決定,中止ECMAScript 4.0的開發,將其中涉及現有功能改善的一小部分,發布為ECMAScript 3.1,而將其他激進的設想擴大范圍,放入以后的版本,由于會議的氣氛,該版本的項目代號起名為Harmony(和諧)。會后不久,ECMAScript 3.1就改名為ECMAScript 5。
2009年12月,ECMAScript 5.0版正式發布。Harmony項目則一分為二,一些較為可行的設想定名為Javascript.next繼續開發,后來演變成ECMAScript 6;一些不是很成熟的設想,則被視為JavaScript.next.next,在更遠的將來再考慮推出。
2011年6月,ECMAscript 5.1版發布,并且成為ISO國際標準(ISO/IEC 16262:2011)。
2013年3月,ECMAScript 6草案凍結,不再添加新功能。新的功能設想將被放到ECMAScript 7。
2013年12月,ECMAScript 6草案發布。然后是12個月的討論期,聽取各方反饋。
2014年12月,ECMAScript 6預計將發布正式版本。
TC39的總體考慮是,ECMAScript 5與ECMAScript 3基本保持兼容,較大的語法修正和新功能加入,將由JavaScript.next完成。當前,JavaScript.next指的是ECMAScript 6,當第六版發布以后,將指ECMAScript 7。 TC39預計,ECMAScript 5會在2013年的年中成為Javascript開發的主流標準,并在今后五年中一直保持這個位置。
雖然ECMAScript是JavaScript的標準,但是Netscape公司(以及后來的Mozilla基金會)在內部依然使用自己的版本號。這導致了JavaScript有自己不同于ECMAScript的版本號。
1996年3月,Navigator 2.0內置了JavaScript 1.0。
1996年8月,Navigator 3.0內置了JavaScript 1.1。
1997年6月,Navigator 4.0內置了JavaScript 1.2。
1998年10月,Navigator 4.06內置了JavaScript 1.3。
1999年,Netscape服務器版提供JavaScript 1.4。
2000年11月,Navigator 6.0內置了JavaScript 1.5。
2005年11月,Firefox 1.5內置了JavaScript 1.6。
2006年10月,Firfox 2.0內置了JavaScript 1.7。
2008年6月,Firefox 3.0內置了JavaScript 1.8。
JavaScript 1.1版對應ECMAScript 1.0,但是直到JavaScript 1.4版才完全兼容ECMAScript 1.0。JavaScript 1.5版完全兼容ECMAScript 3.0。目前的JavaScript 1.8版完全兼容ECMAScript 5。
截止2013年初,所有瀏覽器的最新版本——Chrome 24,Firefox 19,IE 10.0,Opera 12,Safari 6——都支持ECMAScript 5.1版。
## 周邊大事記
1996年,樣式表標準CSS第一版發布。
1997年,DHTML(Dynamic HTML,動態HTML)發布,允許動態改變網頁內容。這標志著DOM模式(Document Object Model,文檔對象模型)正式應用。
1998年,Netscape公司開源了瀏覽器套件,這導致了Mozilla項目的誕生。幾個月后,美國在線(AOL)宣布并購Netscape。
1999年,IE 5部署了XMLHttpRequest接口,允許Javascript發出HTTP請求,為后來大行其道的Ajax應用創造了條件。
2000年,KDE項目重寫了瀏覽器引擎KHTML,為后來的WebKit和Blink引擎打下基礎。這一年的10月23日,KDE 2.0發布,第一次將KHTML瀏覽器包括其中。
2001年,微軟公司時隔5年之后,發布了IE瀏覽器的下一個版本Internet Explorer 6。這是當時最先進的瀏覽器,它后來統治了瀏覽器市場多年。
2001年,Douglas Crockford提出了JSON格式,用于取代XML格式,進行服務器和網頁之間的數據交換。JavaScript可以原生支持這種格式,不需要額外部署代碼。
2002年,Mozilla項目發布了它的瀏覽器的第一版,后來起名為Firefox。
2003年,蘋果公司發布了Safari瀏覽器的第一版。
2004年,Google公司發布了Gmail,促成了互聯網應用程序(Web Application)這個概念的誕生。由于Gmail是在4月1日發布的,很多人起初以為這只是一個玩笑。
2004年,Dojo框架誕生,為不同瀏覽器提供了同一接口,并為主要功能提供了便利的調用方法。這標志著JavaScript編程框架的時代開始來臨。
2004年,WHATWG組織成立,致力于加速HTML語言的標準化進程。
2005年,蘋果公司在KHTML引擎基礎上,建立了WebKit引擎。
2005年,Ajax方法(Asynchronous Javascript and XML)正式誕生,Jesse James Garrett發明了這個詞匯。它開始流行的標志是,2月份發布的Google Maps項目大量采用該方法。它幾乎成了新一代網站的標準做法,促成了Web 2.0時代的來臨。
2005年,Apache基金會發布了CouchDB數據庫。這是一個基于JSON格式的數據庫,可以用Javascript函數定義視圖和索引。它在本質上有別于傳統的關系型數據庫,標識著NoSQL類型的數據庫誕生。
2006年,jQuery函數庫誕生,作者為John Resig。jQuery為操作網頁DOM結構提供了非常強大易用的接口,成為了使用最廣泛的函數庫,并且讓Javascript語言的應用難度大大降低,推動了這種語言的流行。
2006年,微軟公司發布IE 7,標志重新開始啟動瀏覽器的開發。
2006年,Google推出 Google Web Toolkit 項目(縮寫為GWT),提供Java編譯成JavaScript的功能,開創了將其他語言轉為JavaScript的先河。
2007年,Webkit引擎在iPhone手機中得到部署。它最初基于KDE項目,2003年蘋果公司首先采用,2005年開源。這標志著Javascript語言開始能在手機中使用了,意味著有可能寫出在桌面電腦和手機中都能使用的程序。
2007年,Douglas Crockford發表了名為《JavaScript: The good parts》的演講,次年由O'Reilly出版社出版。這標志著軟件行業開始嚴肅對待JavaScript語言,對它的語法開始重新認識,
2008年,V8編譯器誕生。這是Google公司為Chrome瀏覽器而開發的,它的特點是讓Javascript的運行變得非常快。它提高了JavaScript的性能,推動了語法的改進和標準化,改變外界對JavaScript的不佳印象。同時,V8是開源的,任何人想要一種快速的嵌入式腳本語言,都可以采用V8,這拓展了JavaScript的應用領域。
2009年,Node.js項目誕生,創始人為Ryan Dahl,它標志著Javascript可以用于服務器端編程,從此網站的前端和后端可以使用同一種語言開發。并且,Node.js可以承受很大的并發流量,使得開發某些互聯網大規模的實時應用變得容易。
2009年,Jeremy Ashkenas發布了CoffeeScript的最初版本。CoffeeScript可以被轉化為JavaScript運行,但是語法要比JavaScript簡潔。這開啟了其他語言轉為JavaScript的風潮。
2009年,PhoneGap項目誕生,它將HTML5和JavaScript引入移動設是備的應用程序開發,主要針對iOS和Android平臺,使得JavaScript可以用于跨平臺的應用程序開發。
2010年,三個重要的項目誕生,分別是NPM、BackboneJS和RequireJS,標志著JavaScript進入模塊化開發的時代。
2011年,微軟公司發布Windows 8操作系統,將JavaScript作為應用程序的開發語言之一,直接提供系統支持。
2011年,Google發布了Dart語言,目的是為了結束JavaScript語言在瀏覽器中的壟斷,提供更合理、更強大的語法和功能。Chromium瀏覽器有內置的Dart虛擬機,可以運行Dart程序,但Dart程序也可以被編譯成JavaScript程序運行。
2011年,微軟工程師[Scott Hanselman](http://www.hanselman.com/blog/JavaScriptIsAssemblyLanguageForTheWebSematicMarkupIsDeadCleanVsMachinecodedHTML.aspx)提出,JavaScript將是互聯網的匯編語言。因為它無所不在,而且正在變得越來越快。其他語言的程序可以被轉成JavaScript語言,然后在瀏覽器中運行。
2012年,單頁面應用程序框架(single-page app framework)開始崛起,AngularJS項目和Ember項目都發布了1.0版本。
2012年,微軟發布TypeScript語言。該語言被設計成JavaScript的超集,這意味著所有JavaScipt程序,都可以不經修改地在TypeScript中運行。同時,TypeScript添加了很多新的語法特性,主要目的是為了開發大型程序,然后還可以被編譯成JavaScript運行。
2012年,Mozilla基金會提出[asm.js](http://asmjs.org/)規格。asm.js是JavaScript的一個子集,所有符合asm.js的程序都可以在瀏覽器中運行,它的特殊之處在于語法有嚴格限定,可以被快速編譯成性能良好的機器碼。這樣做的目的,是為了給其他語言提供一個編譯規范,使其可以被編譯成高效的JavaScript代碼。同時,Mozilla基金會還發起了[Emscripten](https://github.com/kripken/emscripten/wiki)項目,目標就是提供一個跨語言的編譯器,能夠將LLVM的位代碼(bitcode)轉為JavaScript代碼,在瀏覽器中運行。因為大部分LLVM位代碼都是從C / C++語言生成的,這意味著C / C++將可以在瀏覽器中運行。此外,Mozilla旗下還有[LLJS](http://mbebenita.github.io/LLJS/)(將JavaScript轉為C代碼)項目和[River Trail](https://github.com/RiverTrail/RiverTrail/wiki)(一個用于多核心處理器的ECMAScript擴展)項目。目前,在可以被編譯成JavaScript的[語言列表](https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS)上,共有將近40種語言。
2013年,Mozilla基金會發布手機操作系統Firefox OS,該操作系統的整個用戶界面都使用JavaScript。
2013年,ECMA正式推出JSON的[國際標準](http://www.ecma-international.org/publications/standards/Ecma-404.htm),這意味著JSON格式已經變得與XML格式一樣重要和正式了。
2014年,微軟推出JavaScript的Windows庫WinJS,標志微軟公司全面支持JavaScript與Windows操作系統的融合。
2014年11月,由于對Joyent公司壟斷Node項目、以及該項目進展緩慢的不滿,一部分核心開發者離開了Node.js,創造了io.js項目,這是一個更開放、更新更頻繁的Node.js版本,很短時間內就發布到了2.0版。三個月后,Joyent公司宣布放棄對Node項目的控制,將其轉交給新成立的開放性質的Node基金會。隨后,io.js項目宣布回歸Node,兩個版本將合并。
2015年3月,Facebook公司發布了React Native項目,將React框架移植到了手機端,可以用來開發手機App。它會將JavaScript代碼轉為iOS平臺的Object-C代碼,或者Android平臺的Java代碼,從而為JavaScript語言開發高性能的原生App打開了一條道路。
2015年4月,Angular框架宣布,2.0版將基于微軟公司的TypeScript語言開發,這等于為JavaScript語言引入了強類型。
2015年5月,Node模塊管理器npm超越CPAN,標志著JavaScript成為世界上軟件模塊最多的語言。
2015年5月,Google公司的Polymer框架發布1.0版。該項目的目標是生產環境可以使用WebComponent組件,如果能夠達到目標,Web開發將進入一個全新的以組件為開發基礎的階段。
2015年6月,ECMA標準化組織正式批準了ECMAScript 6語言標準,JavaScript語言正式進入了下一個階段,成為一種企業級的、開發大規模應用的語言。這個標準從提出到批準,歷時10年,而JavaScript語言從誕生至今 也已經20年了。
2015年6月,Mozilla在asm.js的基礎上發布WebAssembly項目。這是一種JavaScript語言編譯后的二進制格式,類似于Java的字節碼,有利于移動設備加載JavaScript腳本,解析速度提高了20+倍。這意味著將來的軟件,會發布JavaScript二進制包。
## 參考鏈接
* Axel Rauschmayer,?[The Past, Present, and Future of JavaScript](http://oreilly.com/javascript/radarreports/past-present-future-javascript.csp)
* John Dalziel,?[The race for speed part 4: The future for JavaScript](http://creativejs.com/2013/06/the-race-for-speed-part-4-the-future-for-javascript/)
* Axel Rauschmayer,?[Basic JavaScript for the impatient programmer](http://www.2ality.com/2013/06/basic-javascript.html)
* resin.io,?[Happy 18th Birthday JavaScript! A look at an unlikely past and bright future](http://resin.io/happy-18th-birthday-javascript/)
- 第一章 導論
- 1.1 前言
- 1.2 為什么學習JavaScript?
- 1.3 JavaScript的歷史
- 第二章 基本語法
- 2.1 語法概述
- 2.2 數值
- 2.3 字符串
- 2.4 對象
- 2.5 數組
- 2.6 函數
- 2.7 運算符
- 2.8 數據類型轉換
- 2.9 錯誤處理機制
- 2.10 JavaScript 編程風格
- 第三章 標準庫
- 3.1 Object對象
- 3.2 Array 對象
- 3.3 包裝對象和Boolean對象
- 3.4 Number對象
- 3.5 String對象
- 3.6 Math對象
- 3.7 Date對象
- 3.8 RegExp對象
- 3.9 JSON對象
- 3.10 ArrayBuffer:類型化數組
- 第四章 面向對象編程
- 4.1 概述
- 4.2 封裝
- 4.3 繼承
- 4.4 模塊化編程
- 第五章 DOM
- 5.1 Node節點
- 5.2 document節點
- 5.3 Element對象
- 5.4 Text節點和DocumentFragment節點
- 5.5 Event對象
- 5.6 CSS操作
- 5.7 Mutation Observer
- 第六章 瀏覽器對象
- 6.1 瀏覽器的JavaScript引擎
- 6.2 定時器
- 6.3 window對象
- 6.4 history對象
- 6.5 Ajax
- 6.6 同域限制和window.postMessage方法
- 6.7 Web Storage:瀏覽器端數據儲存機制
- 6.8 IndexedDB:瀏覽器端數據庫
- 6.9 Web Notifications API
- 6.10 Performance API
- 6.11 移動設備API
- 第七章 HTML網頁的API
- 7.1 HTML網頁元素
- 7.2 Canvas API
- 7.3 SVG 圖像
- 7.4 表單
- 7.5 文件和二進制數據的操作
- 7.6 Web Worker
- 7.7 SSE:服務器發送事件
- 7.8 Page Visibility API
- 7.9 Fullscreen API:全屏操作
- 7.10 Web Speech
- 7.11 requestAnimationFrame
- 7.12 WebSocket
- 7.13 WebRTC
- 7.14 Web Components
- 第八章 開發工具
- 8.1 console對象
- 8.2 PhantomJS
- 8.3 Bower:客戶端庫管理工具
- 8.4 Grunt:任務自動管理工具
- 8.5 Gulp:任務自動管理工具
- 8.6 Browserify:瀏覽器加載Node.js模塊
- 8.7 RequireJS和AMD規范
- 8.8 Source Map
- 8.9 JavaScript 程序測試
- 第九章 JavaScript高級語法
- 9.1 Promise對象
- 9.2 有限狀態機
- 9.3 MVC框架與Backbone.js
- 9.4 嚴格模式
- 9.5 ECMAScript 6 介紹
- 附錄
- 10.1 JavaScript API列表
- 草稿一:函數庫
- 11.1 Underscore.js
- 11.2 Modernizr
- 11.3 Datejs
- 11.4 D3.js
- 11.5 設計模式
- 11.6 排序算法
- 草稿二:jQuery
- 12.1 jQuery概述
- 12.2 jQuery工具方法
- 12.3 jQuery插件開發
- 12.4 jQuery.Deferred對象
- 12.5 如何做到 jQuery-free?
- 草稿三:Node.js
- 13.1 Node.js 概述
- 13.2 CommonJS規范
- 13.3 package.json文件
- 13.4 npm模塊管理器
- 13.5 fs 模塊
- 13.6 Path模塊
- 13.7 process對象
- 13.8 Buffer對象
- 13.9 Events模塊
- 13.10 stream接口
- 13.11 Child Process模塊
- 13.12 Http模塊
- 13.13 assert 模塊
- 13.14 Cluster模塊
- 13.15 os模塊
- 13.16 Net模塊和DNS模塊
- 13.17 Express框架
- 13.18 Koa 框架