一劝堪、誕生
JavaScript 因為互聯(lián)網(wǎng)而生,緊跟著瀏覽器的出現(xiàn)而問世弹囚〕啵回顧它的歷史,就要從瀏覽器的歷史講起。
1990年底蛮穿,歐洲核能研究組織(CERN)科學家 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)頁都是在字符窗口中顯示羔飞,這當然非常不方便。
1992年底檐春,美國國家超級電腦應(yīng)用中心(NCSA)開始開發(fā)一個獨立的瀏覽器逻淌,叫做 Mosaic。這是人類歷史上第一個瀏覽器疟暖,從此網(wǎng)頁可以在圖形界面的窗口瀏覽卡儒。
1994年10月,NCSA 的一個主要程序員 Marc Andreessen 聯(lián)合風險投資家 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)頁的腳本語言赎线,用來控制瀏覽器行為。當時糊饱,網(wǎng)速很慢而且上網(wǎng)費很貴垂寥,有些操作不宜在服務(wù)器端完成。比如另锋,如果用戶忘記填寫“用戶名”滞项,就點了“發(fā)送”按鈕,到服務(wù)器再發(fā)現(xiàn)這一點就有點太晚了夭坪,最好能在用戶發(fā)出數(shù)據(jù)之前文判,就告訴用戶“請?zhí)顚懹脩裘薄_@就需要在網(wǎng)頁中嵌入小程序室梅,讓瀏覽器檢查每一欄是否都填寫了戏仓。
管理層對這種瀏覽器腳本語言的設(shè)想是:功能不需要太強疚宇,語法較為簡單,容易學習和部署赏殃。那一年敷待,正逢 Sun 公司的 Java 語言問世,市場推廣活動非常成功仁热。Netscape 公司決定與 Sun 公司合作榜揖,瀏覽器支持嵌入 Java 小程序(后來稱為 Java applet)。但是抗蠢,瀏覽器腳本語言是否就選用 Java举哟,則存在爭論。后來物蝙,還是決定不使用 Java,因為網(wǎng)頁小程序不需要 Java 這么“重”的語法敢艰。但是诬乞,同時也決定腳本語言的語法要接近 Java,并且可以支持 Java 程序钠导。這些設(shè)想直接排除了使用現(xiàn)存語言震嫉,比如 Perl、Python 和 TCL牡属。
1995年票堵,Netscape 公司雇傭了程序員 Brendan Eich 開發(fā)這種網(wǎng)頁腳本語言。Brendan Eich 有很強的函數(shù)式編程背景逮栅,希望以 Scheme 語言(函數(shù)式語言鼻祖 LISP 語言的一種方言)為藍本悴势,實現(xiàn)這種新語言。
1995年5月措伐,Brendan Eich 只用了10天特纤,就設(shè)計完成了這種語言的第一版。它是一個大雜燴侥加,語法有多個來源捧存。
基本語法:借鑒 C 語言和 Java 語言。
數(shù)據(jù)結(jié)構(gòu):借鑒 Java 語言担败,包括將值分成原始值和對象兩大類昔穴。
函數(shù)的用法:借鑒 Scheme 語言和 Awk 語言,將函數(shù)當作第一等公民提前,并引入閉包吗货。
原型繼承模型:借鑒 Self 語言(Smalltalk 的一種變種)。
正則表達式:借鑒 Perl 語言狈网。
字符串和數(shù)組處理:借鑒 Python 語言卿操。
為了保持簡單警检,這種腳本語言缺少一些關(guān)鍵的功能,比如塊級作用域害淤、模塊扇雕、子類型(subtyping)等等,但是可以利用現(xiàn)有功能找出解決辦法窥摄。這種功能的不足镶奉,直接導致了后來 JavaScript 的一個顯著特點:對于其他語言,你需要學習語言的各種功能崭放,而對于 JavaScript哨苛,你常常需要學習各種解決問題的模式。而且由于來源多樣币砂,從一開始就注定建峭,JavaScript 的編程風格是函數(shù)式編程和面向?qū)ο缶幊痰囊环N混合體。
Netscape 公司的這種瀏覽器腳本語言决摧,最初名字叫做 Mocha亿蒸,1995年9月改為 LiveScript。12月掌桩,Netscape 公司與 Sun 公司(Java 語言的發(fā)明者和所有者)達成協(xié)議边锁,后者允許將這種語言叫做 JavaScript。這樣一來波岛,Netscape 公司可以借助 Java 語言的聲勢茅坛,而 Sun 公司則將自己的影響力擴展到了瀏覽器。
之所以起這個名字则拷,并不是因為 JavaScript 本身與 Java 語言有多么深的關(guān)系(事實上贡蓖,兩者關(guān)系并不深,詳見下節(jié))煌茬,而是因為 Netscape 公司已經(jīng)決定摩梧,使用 Java 語言開發(fā)網(wǎng)絡(luò)應(yīng)用程序,JavaScript 可以像膠水一樣宣旱,將各個部分連接起來仅父。當然,后來的歷史是 Java 語言的瀏覽器插件失敗了浑吟,JavaScript 反而發(fā)揚光大笙纤。
1995年12月4日,Netscape 公司與 Sun 公司聯(lián)合發(fā)布了 JavaScript 語言组力,對外宣傳 JavaScript 是 Java 的補充省容,屬于輕量級的 Java,專門用來操作網(wǎng)頁燎字。
1996年3月腥椒,Navigator 2.0 瀏覽器正式內(nèi)置了 JavaScript 腳本語言阿宅。
二、JavaScript 與 Java 的關(guān)系
這里專門說一下 JavaScript 和 Java 的關(guān)系笼蛛。它們是兩種不一樣的語言洒放,但是彼此存在聯(lián)系。
JavaScript 的基本語法和對象體系滨砍,是模仿 Java 而設(shè)計的往湿。但是,JavaScript 沒有采用 Java 的靜態(tài)類型惋戏。正是因為 JavaScript 與 Java 有很大的相似性领追,所以這門語言才從一開始的 LiveScript 改名為 JavaScript∠旆辏基本上绒窑,JavaScript 這個名字的原意是“很像Java的腳本語言”。
JavaScript 語言的函數(shù)是一種獨立的數(shù)據(jù)類型舔亭,以及采用基于原型對象(prototype)的繼承鏈些膨。這是它與 Java 語法最大的兩點區(qū)別。JavaScript 語法要比 Java 自由得多分歇。
另外傀蓉,Java 語言需要編譯欧漱,而 JavaScript 語言則是運行時由解釋器直接執(zhí)行职抡。
總之,JavaScript 的原始設(shè)計目標是一種小型的误甚、簡單的動態(tài)語言缚甩,與 Java 有足夠的相似性,使得使用者(尤其是 Java 程序員)可以快速上手窑邦。
三擅威、JavaScript 與 ECMAScript 的關(guān)系
1996年8月,微軟模仿 JavaScript 開發(fā)了一種相近的語言冈钦,取名為JScript(JavaScript 是 Netscape 的注冊商標郊丛,微軟不能用),首先內(nèi)置于IE 3.0瞧筛。Netscape 公司面臨喪失瀏覽器腳本語言的主導權(quán)的局面厉熟。
1996年11月,Netscape 公司決定將 JavaScript 提交給國際標準化組織 ECMA(European Computer Manufacturers Association)较幌,希望 JavaScript 能夠成為國際標準揍瑟,以此抵抗微軟。ECMA 的39號技術(shù)委員會(Technical Committee 39)負責制定和審核這個標準乍炉,成員由業(yè)內(nèi)的大公司派出的工程師組成绢片,目前共25個人滤馍。該委員會定期開會,所有的郵件討論和會議記錄底循,都是公開的巢株。
1997年7月,ECMA 組織發(fā)布262號標準文件(ECMA-262)的第一版此叠,規(guī)定了瀏覽器腳本語言的標準纯续,并將這種語言稱為 ECMAScript。這個版本就是 ECMAScript 1.0 版灭袁。之所以不叫 JavaScript猬错,一方面是由于商標的關(guān)系,Java 是 Sun 公司的商標茸歧,根據(jù)一份授權(quán)協(xié)議倦炒,只有 Netscape 公司可以合法地使用 JavaScript 這個名字,且 JavaScript 已經(jīng)被 Netscape 公司注冊為商標软瞎,另一方面也是想體現(xiàn)這門語言的制定者是 ECMA逢唤,不是 Netscape,這樣有利于保證這門語言的開放性和中立性涤浇。因此鳖藕,ECMAScript 和 JavaScript 的關(guān)系是,前者是后者的規(guī)格只锭,后者是前者的一種實現(xiàn)著恩。在日常場合,這兩個詞是可以互換的蜻展。
ECMAScript 只用來標準化 JavaScript 這種語言的基本語法結(jié)構(gòu)喉誊,與部署環(huán)境相關(guān)的標準都由其他標準規(guī)定,比如 DOM 的標準就是由 W3C組織(World Wide Web Consortium)制定的纵顾。
ECMA-262 標準后來也被另一個國際標準化組織 ISO(International Organization for Standardization)批準伍茄,標準號是 ISO-16262。
四施逾、JavaScript 的版本
1997年7月敷矫,ECMAScript 1.0發(fā)布。
1998年6月汉额,ECMAScript 2.0版發(fā)布曹仗。
1999年12月,ECMAScript 3.0版發(fā)布闷愤,成為 JavaScript 的通行標準整葡,得到了廣泛支持。
2007年10月讥脐,ECMAScript 4.0版草案發(fā)布遭居,對3.0版做了大幅升級啼器,預(yù)計次年8月發(fā)布正式版本。草案發(fā)布后俱萍,由于4.0版的目標過于激進端壳,各方對于是否通過這個標準,發(fā)生了嚴重分歧枪蘑。以 Yahoo损谦、Microsoft、Google 為首的大公司岳颇,反對 JavaScript 的大幅升級照捡,主張小幅改動;以 JavaScript 創(chuàng)造者 Brendan Eich 為首的 Mozilla 公司话侧,則堅持當前的草案栗精。
2008年7月,由于對于下一個版本應(yīng)該包括哪些功能瞻鹏,各方分歧太大悲立,爭論過于激進,ECMA 開會決定新博,中止 ECMAScript 4.0 的開發(fā)(即廢除了這個版本)薪夕,將其中涉及現(xiàn)有功能改善的一小部分,發(fā)布為 ECMAScript 3.1赫悄,而將其他激進的設(shè)想擴大范圍原献,放入以后的版本,由于會議的氣氛涩蜘,該版本的項目代號起名為 Harmony(和諧)嚼贡。會后不久熏纯,ECMAScript 3.1 就改名為 ECMAScript 5同诫。
2009年12月,ECMAScript 5.0版 正式發(fā)布樟澜。Harmony 項目則一分為二误窖,一些較為可行的設(shè)想定名為 JavaScript.next 繼續(xù)開發(fā),后來演變成 ECMAScript 6秩贰;一些不是很成熟的設(shè)想霹俺,則被視為 JavaScript.next.next,在更遠的將來再考慮推出毒费。TC39 的總體考慮是丙唧,ECMAScript 5 與 ECMAScript 3 基本保持兼容,較大的語法修正和新功能加入觅玻,將由 JavaScript.next 完成想际。當時培漏,JavaScript.next 指的是ECMAScript 6。第六版發(fā)布以后胡本,將指 ECMAScript 7牌柄。TC39 預(yù)計,ECMAScript 5 會在2013年的年中成為 JavaScript 開發(fā)的主流標準侧甫,并在此后五年中一直保持這個位置珊佣。
2011年6月,ECMAScript 5.1版發(fā)布披粟,并且成為 ISO 國際標準(ISO/IEC 16262:2011)咒锻。到了2012年底,所有主要瀏覽器都支持 ECMAScript 5.1版的全部功能守屉。
2013年3月虫碉,ECMAScript 6 草案凍結(jié),不再添加新功能胸梆。新的功能設(shè)想將被放到 ECMAScript 7敦捧。
2013年12月,ECMAScript 6 草案發(fā)布碰镜。然后是12個月的討論期兢卵,聽取各方反饋。
2015年6月绪颖,ECMAScript 6 正式發(fā)布秽荤,并且更名為“ECMAScript 2015”。這是因為 TC39 委員會計劃柠横,以后每年發(fā)布一個 ECMAScript 的版本窃款,下一個版本在2016年發(fā)布,稱為“ECMAScript 2016”牍氛,2017年發(fā)布“ECMAScript 2017”晨继,以此類推。