在行文以前,反手就安利一下《瀏覽器史話中chrome霸主地位的奠基與國產瀏覽器的割據混戰》。javascript
瀏覽器始祖NCSA Mosaic在1993年1月發佈(於1992年底由國家超級計算機應用中心—National Center for Supercomputing Applications開發)。Mosaic能夠同時展現文字和圖片,今後瀏覽器變得有趣多了。 在當時人氣爆發的大受歡迎。Mosaic的出現,算是點燃了後期互聯網熱潮的火種之一。NCSA將Mosaic的商業運營權轉售給了Spyglass公司,該公司又向包括微軟公司在內的多家公司技術受權,容許其在 Mosaic的基礎上開發本身的產品html
MOSAIC開發的中心人物馬克·安德森和吉姆·克拉克(幾何圖形發生器發明人、SGI與Healtheon公司的創始人)設立了「MOSAIC Communication Corp.」,這家公司以後1994年11月更名爲「Netscape Communication Corp.」,中譯爲網景。網景通訊聘用了許多原有的Mosaic瀏覽器工程師,可是沒有采用Mosaic網頁瀏覽器的任何代碼。java
1994年10月13日,網景通訊公司推出發佈了Mosaic Netscape 0.9(網景導航者、網景瀏覽器),年末推出Netscape1.0,自稱「Mozilla/1.0(Win3.1)。聽說Mozilla = Mosaic + Killer,意爲Mosaic殺手,也有說法是 Mozilla = Mosaic & Godzilla,意爲馬賽克和哥斯拉,而Mozilla最初的吉祥物是隻綠色大蜥蜴。Netscape Navigator 取得了巨大成功,在發佈的 4 個月裏佔據了 75% 的瀏覽器市場,短時間內成爲了默認瀏覽器。git
瀏覽器其實階段,不具有與訪問者互動的能力。......網景公司急需一種網頁腳本語言,使得瀏覽器能夠與網頁互動。起初它的主要目的是處理之前由服務器端負責的一些表單驗證。在那個絕大多數用戶都在使用調制解調器上網的時代,用戶填寫完一個表單點擊提交,須要等待幾十秒,完了服務器反饋給你說某個地方填錯了......在當時若是能在客戶端完成一些基本的驗證絕對是使人興奮的。當時走在技術革新最前沿的Netscape(網景)公司,決定着手開發一種客戶端腳本語言,用來處理這種裝簡單的驗證。程序員
網景公司當時有兩個選擇:一個是採用現有的語言,好比Perl、Python、Tcl、Scheme等等,容許它們直接嵌入網頁;另外一個是發明一種全新的語言。es6
這兩個選擇各有利弊。第一個選擇,有利於充分利用現有代碼和程序員資源,推廣起來比較容易;第二個選擇,有利於開發出徹底適用的語言,實現起來比較容易。github
到底採用哪個選擇,網景公司內部爭執不下,管理層一時難如下定決心。web
就在這時,發生了另一件大事:1995年Sun公司將Oak語言更名爲Java,正式向市場推出(次年,LiveScript更名爲JavaScript)。正則表達式
Sun公司大肆宣傳,許諾這種語言能夠"一次編寫,處處運行"(Write Once, Run Anywhere),它看上去極可能成爲將來的主宰。chrome
網景公司動了心,決定與Sun公司結成聯盟。它不只容許Java程序以applet(小程序)的形式,直接在瀏覽器中運行;甚至還考慮直接將Java做爲腳本語言嵌入網頁,只是由於這樣會使HTML網頁過於複雜,後來纔不得不放棄。總之,當時的形勢就是,網景公司的整個管理層,都是Java語言的信徒,Sun公司徹底介入網頁腳本語言的決策。
1995年4月,網景公司錄用34歲Brendan Eich( JavaScript 之父 閃亮登場)。
Brendan Eich的主要方向和興趣是函數式編程,網景公司招聘他的目的,是研究將Scheme語言做爲網頁腳本語言的可能性。Brendan Eich本人也是這樣想的,覺得進入新公司後,會主要與Scheme語言打交道。
僅僅一個月以後,1995年5月,網景公司作出決策,將來的網頁腳本語言必須"看上去與Java足夠類似",可是比Java簡單,使得非專業的網頁做者也能很快上手。這個決策實際上將Perl、Python、Tcl、Scheme等非面向對象編程的語言都排除在外了。
Brendan Eich被指定爲這種"簡化版Java語言"的設計師。可是,他對Java一點興趣也沒有。爲了完成(應付)公司安排的任務,他只用10天時間就把JavaScript設計出來了。雖然語言的設計者水平很是NB,但誰也架不住「時間緊,任務重」。因爲設計時間過短,語言的一些細節考慮得不夠嚴謹,致使後來很長一段時間,Javascript寫出來的程序混亂不堪。若是不是公司的決策,Brendan Eich毫不可能把Java做爲Javascript設計的原型。做爲設計者,他一點也不喜歡本身的這個做品:
"與其說我愛Javascript,不如說我恨它。它是C語言和Self語言一晚上情的產物。十八世紀英國文學家約翰遜博士說得好:'它的優秀之處並不是原創,它的原創之處並不優秀。'(the part that is good is not original, and the part that is original is not good.)"
在其自敘中
1995年4月,在SiliconGraphics工做了七年,又在MicroUnity System Enineering工做三年以後,我來到了如今的Netscape公司。Netscape公司一年前就開始找人開發一種腳本語言,但願可以運用到瀏覽器的網頁裏,讓我網可以動起來。Java從First Person到Sun也通過了五個春秋,1994年是還爲了可以應用到Web上而重構過。Netscape第一個得到了Java的認證,所以一個問題出現了:咱們直接使用Java,仍是令搞一個語言?
有的人極力主張使用Java,Java很好,很適合程序員寫組件。可是還有更多的人只是寫點腳本,或者直接把別人的腳本拷過來改一改就行。這些人不是專業的程序員,大部分時間都用來幹別的事情,而不是敲代碼。好比說網管,或者一些只寫腳本的業餘人員。若是他們想寫點代碼,他們只但願隨便敲打兩下鍵盤就行。最後,咱們決定開發一門新語言,必須長得像Java,而且是腳本語言。
與其餘全部語言同樣,它也是從其餘語言借鑑了不少東西。與1995年9月,它第一次跟隨Navegator2.0 beta版一塊兒發佈,當時取名爲LiveScript。緊接着,12月4號,公司與Sun公司一塊兒宣佈合做時改名爲了JavaScript。
JavaScript吸引到了大量的開發者,由於人所要的東西僅僅是從HTML中邁出一步,使用一點代碼是網頁動起來——使東西移動,對用戶的輸入作出反應,或者改變顏色;彈出一個窗口;或者彈出一個對話框問個問題,只有回答了才能繼續——這些事情HTML幹不了,你須要編程語言,可是要足夠簡單,不需像Java或者C++這樣複雜。
內容建設不須要過高深。這不是什麼只有專家或者牛逼哄哄的計算機科學家才能研究的深奧問題。這樣有助於在內容建立和分享過程當中節約成本有經濟優點,。就如Netscape在網絡建設中所作的同樣。
1995推出的Javascript語言其實是兩種語言風格的雜種——(簡化的)函數式編程+(簡化的)面向對象編程,這是由Brendan Eich(函數式編程)與網景公司(面向對象編程)共同決定的。
總的來講,Brendan Eich的設計思路是這樣的:
借鑑C語言的基本語法;
借鑑Java語言的數據類型和內存管理;
借鑑Scheme語言,將函數提高到"第一等公民"(first class)的地位;
借鑑Self語言,使用基於原型(prototype)的繼承機制。
做爲曾經的java工程師,曾經也被單片機虐過千萬遍,可是,最討厭的仍是JS。好比寫《圖說js中的this——深刻理解javascript中this指針》
在面向對象編程裏有兩個重要的概念:一個是類,一個是實例化的對象,類是一個抽象的概念,用個形象的比喻表述的話,類就像一個模具,而實例化對象就是經過這個模具製造出來的產品,實例化對象纔是咱們須要的實實在在的東西,類和實例化對象有着很密切的關係,可是在使用上類的功能是絕對不能取代實例化對象,就像模具和模具製造的產品的關係,兩者的用途是不相同的。
其實javascript裏的this指針邏輯上的概念也是實例化對象,這一點和java語言裏的this指針是一致的,可是javascript裏的this指針卻比java裏的this難以理解的多,究其根本緣由我我的以爲有三個緣由:
緣由一:javascript是一個函數編程語言,怪就怪在它也有this指針,說明這個函數編程語言也是面向對象的語言,說的具體點,javascript裏的函數是一個高階函數,編程語言裏的高階函數是能夠做爲對象傳遞的,同時javascript裏的函數還有能夠做爲構造函數,這個構造函數能夠建立實例化對象,結果致使方法執行時候this指針的指向會不斷髮生變化,很難控制。
緣由二:javascript裏的全局做用域對this指針有很大的影響,由上面java的例子咱們看到,this指針只有在使用new操做符後纔會生效,可是javascript裏的this在沒有進行new操做也會生效,這時候this每每會指向全局對象window。
緣由三:javascript裏call和apply操做符能夠隨意改變this指向,這看起來很靈活,可是這種不合常理的作法破壞了咱們理解this指針的本意,同時也讓寫代碼時候很難理解this的真正指向
1995年Netscape Navigator 2上首先實現了該語言的JavaScript 1.0版,主要應用於客戶端Web應用程序開發,因爲及時推出了相關標準,以及語言自己使用簡單,實現功能強大的優勢,受到Web應有程序開發者的追捧。
JavaScript最初叫 Mocha, 接着更名爲 LiveScript。
1996年的時候Java煊赫一時,Netscape爲了搭上媒體熱炒Java的順風車,因而某產品經理,命令改名。爲了「Javascript」像Java,最後才肯定命名爲 JavaScript。這讓不少人誤認爲JavaScript是Java的低級版,其實並非雷鋒和雷峯塔的關係這麼簡單。根據歷史記錄,Java 的命名與 Netscape 和 Sun 之間的合做有關。Netscape與Sun公司成立了一個開發聯盟,Netsacpe的腳本語言能夠叫JavaScript,做爲交換條件,Netscape 在他們備受歡迎的瀏覽器中建立了 Java 運行環境。所以,Javascript實際上是網景和Sun兩家公司一塊兒攜手推向市場的,這種語言被命名爲"Java+script"並不是單純的網頁腳本語言揩油Java這麼簡單,實際上是你儂我儂的事情。要知道,LiveScript 和 Java 在客戶端腳本方面(如Java applet)存在敵對關係。
Java Applet是用Java語言編寫的,有特定用途的應用程序,其直接嵌入到HTML頁面中,由支持Java的瀏覽器解釋執行併發揮其特定功能,大大提升Web頁面的交互和動態執行能力,包含Applet應用程序的頁面被稱爲Java-powered頁。
當用戶訪問這樣的網頁時,若是客戶端瀏覽器支持Java,並無將瀏覽器對Java的支持選項設置爲禁止,則Applet被下載到用戶的計算機上執行,並執行速度不受網絡帶寬的限制,用戶能夠更好地欣賞網頁上Applet產生的各類效果。
ScriptEase是大概誕生於1992年,由Nombas 的公司開發了一種叫作 C 減減(C-minus-minus,簡稱 Cmm)的嵌入式腳本語言更名而來(聽說後面的部分(mm)聽起來過於消極,同時字母 C 「使人懼怕」)。
Cmm 背後的理念很簡單:一個足夠強大能夠替代宏操做(macro)的腳本語言,同時保持與 C (和 C ++)足夠的類似性,以便開發人員能很快學會。這個腳本語言捆綁在一個叫作 CEnvi 的共享軟件中,它首次向開發人員展現了這種語言的威力。
VBScript(Microsoft Visual Basic Scripting Edition)是程序開發語言Visual Basic家族的最新成員,它將靈活的腳本應用於更普遍的領域,包括Microsoft Internet Explorer中的Web客戶端腳本和Microsoft Internet Infomation Server中的Web服務器端腳本。VBScript也是Microsoft推出的產品,開始主要定位於客戶端腳本,因爲動態頁面技術的快速發展,VBScript走向服務器端,與ASP,IIS(Internet Infomation Server, Internet信息服務)緊密結合,有力促進動態頁面技術的發展。
Microsoft的JScript和VBScript腳本應用在服務器端,執行相應的管理權限,同時Microsoft提供其訪問系統組建的API,使之與系統緊密結合,如訪問本地數據庫,並將結果返回客戶端瀏覽器等。
或許由於由於JavaScript 1.0得到了巨大的成功,網景一看瀏覽器業務蒸蒸日上,野心大漲,打起搞個操做系統的注意,微軟意識到網景通信公司對其操做系統和應用市場的威脅,立馬收購另一家瀏覽器公司,在其基礎上開發了Internet Explorer網景跟微軟的撕逼大戰沒必要多說,這中間就是多出了IE。
隨着電腦技術的日新月異和互聯網的崛起,Internet瀏覽器技術方興未艾,而比爾•蓋茨認爲,決定將來計算機世界命運的,還是「視窗」技術而不會是瀏覽器技術。所以,他僅僅在新推出的Windows95中增長了一個網絡瀏覽功能,而並無進行瀏覽器技術開發的計劃。
在隨後的兩年內,網景專一於瀏覽器技術的開發。很快,伴隨着NC、JAVA等技術標準的提出,一種基於Internet而首次與微軟無關的新的軟硬件體系造成了。以網景爲首的一批互聯網技術公司應聲崛起,迅速構成了一股隱隱然能夠與微軟平起平坐的新力量。一個顯而易見的事實正在生成:若是網景在瀏覽器市場上取得壟斷性優點,它就徹底有可能和實力推出一套新的操做系統以替代微軟的Windows。
「微軟錯了。將來的世界不是PC,而是Internet。」比爾•蓋茨很快就意識到,他犯下了一個足以讓微軟走向毀滅的錯誤。
1997年,微軟發佈了性能穩定的IE 4.0,並捆綁windows銷售,今後終結了Netscape 的王者之路
做爲競爭對手的微軟在自家的IE3中加入了名爲JScript(名稱不一樣是爲了不侵權)的JavaScript實現,微軟用JScript1.0來搶佔客戶端腳本市場。
而此時市面上意味着有3個不一樣的JavaScript版本(web腳本語言),IE的JScript、網景的JavaScript和ScriptEase中的CEnvi。當時尚未標準規定JavaScript的語法和特性。隨着版本不一樣暴露的問題日益加重,JavaScript的規範化最終被提上日程。
1997年,以JavaScript1.1爲藍本的建議被提交給了歐洲計算機制造商協會(ECMA,European Computer Manufactures Association)該協會指定39號技術委員會負責將其進行標準化,TC39來此各大公司以及其餘關注腳本語言發展的公司的程序員組成,通過數月的努力完成了ECMA-262——定義了一種名爲ECMAScript的新腳本語言的標準。第二年,ISO/IEC(國標標準化組織和國際電工委員會)也採用了ECMAScript做爲標準(即ISO/IEC-16262)。
由ECMA-262定義的ECMAScript其實與Web瀏覽器沒有依賴關係。Web瀏覽器只是ECMAScript實現可能的宿主環境之一。ECMA-262定義的只這門語言的基礎,而在此基礎上可能構建更完善的腳本語言。說回宿主,它不只提供基本的JavaScript的實現,同時也會提供該語言的擴展,好比DOM。好比JavaScript實現:
雖然JavaScript和ECMAScript一般被人用來表達相同的意思,但JavaScript的含義去比ECMA-262中規定的多得多。一個完整的JavaScript實現應由三個部分組成:
核心(ECMAScript)
文檔對象模型(DOM)
瀏覽器對象模型(BOM)
ECMAScript其餘宿主環境還包括Node和Adobe Flash。
ECMA-262標準主要規定了這門語言的如下組成部分:1.語法,2.類型,3.語句,4.關鍵字,5.保留字,6.操做符,7.對象。
TC39(Technical Committee 39)是一個推進JavaScript發展的委員會,它的成語來自各個主流瀏覽器的表明成語。會議實行多數決,每一項決策只有大部分人贊成且沒有強烈反對才能去實現。
TC39成員制定着ECMAScript的將來。
每一項新特性最終要進入到ECMAScript規範裏,須要經歷5個階段,這5個階段以下:
Stage 0: Strawperson
只要是TC39成員或者貢獻者,均可以提交想法
Stage 1: Proposal
這個階段肯定一個正式的提案
Stage 2: draft
規範的第一個版本,進入此階段的提案大機率會成爲標準
Stage 3: Candidate
進一步完善提案細則
Stage 4: Finished
表示已準備好將其添加到正式的ECMAScript標準中
至發稿日爲止有九個ECMA-262版本發表。其歷史版本以下:
1997年6月:初版
1998年6月:修改格式,使其與ISO/IEC16262國際標準同樣
1999年12月:強大的正則表達式,更好的詞法做用域鏈處理,新的控制指令,異常處理,錯誤定義更加明確,數據輸出的格式化及其它改變
2009年12月:添加嚴格模式("use strict"
)。修改了前面版本模糊不清的概念。增長了getters,setters,JSON以及在對象屬性上更完整的反射。
2011年6月:ECMAScript標5.1版形式上徹底一致於國際標準ISO/IEC 16262:2011。
2015年6月:ECMAScript 2015(ES2015),第 6 版,最先被稱做是 ECMAScript 6(ES6),添加了類和模塊的語法,其餘特性包括迭代器,Python風格的生成器和生成器表達式,箭頭函數,二進制數據,靜態類型數組,集合(maps,sets 和 weak maps),promise,reflection 和 proxies。做爲最先的 ECMAScript Harmony 版本,也被叫作ES6 Harmony。
2016年6月:ECMAScript 2016(ES2016),第 7 版,多個新的概念和語言特性。
2017年6月:ECMAScript 2017(ES2017),第 8 版,多個新的概念和語言特性。
2018年6月:ECMAScript 2018 (ES2018),第 9 版,包含了異步循環,生成器,新的正則表達式特性和 rest/spread 語法。
2019年6月:ECMAScript 2019 (ES2019),第 10 版。
轉載本站文章《ECMAScript進化史(1):話說Web腳本語言王者JavaScript的加冕歷史》,
請註明出處:https://www.zhoulujun.cn/html/webfront/ECMAScript/js6/2015_0720_141.html