和CSS同樣,JavaScript在各瀏覽器下並不是徹底一致,它所帶來的兼容性問題時常困擾着咱們,以致於如今「可否處理流行瀏覽器的兼容性問題」成爲了檢驗一個程序員是否合格的標準之一。瞭解JavaScript的前世此生或許可以幫助咱們更好的理解和處理瀏覽器帶來的兼容性問題。同時,初學者站在更高的地方去從新審視一下JavaScript,或許可以揭開它的神祕面紗,一旦它失去了神祕性而變得平易近人,學習起來就會更加輕鬆。前端
前些天,我看了一本書《JavaScript核心概念及實踐》,邱俊濤著。書中過半的內容列舉了一些JavaScript的核心知識點,剩下接近一半的內容介紹了JavaScript解釋引擎,包括但不侷限在Web客戶端。我慢慢有了一個想法,想從新學習一下JavaScript的前世此生,因而便有了這篇文章。node
JavaScript的誕生程序員
衆所周知,Brendan Eich在1995年5月用了10天時間建立了JavaScript語言,最先用於Netscape的Netscape Navigator2瀏覽器。瀏覽器
JavaScript起初命名爲「LiveScript」,爲了趕在發佈日期前完成LiveScript的開發,Netscape聯合Sun公司創建了一個開發聯盟,在Navigator2發佈前夕,Netscape爲了搭上媒體熱炒Java的順風車,臨時把LiveScript改成JavaScript。JavaScript1.1伴隨着Navigator3發佈後,用戶關注度屢創新高,Netscape把本身定位爲市場領袖。服務器
爲了與Netscape競爭,微軟在IE3中加入JavaScript實現,爲了不受權糾紛命名爲JScript。框架
過早的標準化ide
瀏覽器大戰前期,已經有三個不一樣的JavaScript版本共同存在:Navigator中的JavaScript,Internet Explorer中的JScript和ScriptEase中的CEnvi。業內人士飽受惡性競爭帶來的不兼容痛苦,強烈呼籲制定一個語言標準。性能
Netscape以Internet軟件爲所有收入來源,年收入3億。而微軟公司年收入80億,Internet軟件徹底免費,不須要盈利。Netscape早已意識到形式的危急,爲了奠基本身的地位,她以其JavaScript1.1爲藍本,向ECMA提交了標準化申請。最終由39號委員會(TC39),由來自Netscape,微軟,Sun,及其它關注腳本語言發展的公司程序員組成,完成了ECMA-262——定義了一種名爲ECMAScript(發音爲「ek-ma-script」)的腳本語言標準。學習
至今爲止,已經有四個ECMA-262版本發表,代號「Harmony」版本正在工做中。發佈與1999年的ECMAScript第三版(簡稱ES3)是目前被普遍支持的版本。C語言誕生於1972年,而首個標準頒佈於1989年,歷時接近20年。而JavaScript從發明到標準化只用了不到兩年。「過早」的標準化有好處,天然也有壞處。優化
ECMAScript派生語言
在JavaScript被標準化以後,事實上咱們如今說的JavaScript的含義要寬泛的多。在瀏覽器中,一個完整的JavaScript應該有JavaScript Core(ECMAScript),DOM,BOM組成。JavaScript只是ECMAScript的一個派生語言。見下表(摘自維基百科):
應用程序 | 方言 | 相應的ECMAScript版本 |
FireFox | JavaScript 1.8.1 | ECMAScript-262 第五版 |
Chrom | JavaScript | ECMAScript-262 第五版 |
Internet Explorer | JScript 9.0 | ECMAScript-262 第五版 |
Opera | ECMAScript | ECMAScript-262 第五版 |
Safari | JavaScript | ECMAScript-262 第三版 |
Microsoft .NET Framework | JScript .NET8.0 | ECMAScript-262 第三版 |
Adobe Flash及Adobe Flex | ActionScript 3 | ECMAScript-262 第三版 |
JS解釋引擎
一般來講,JavaScript是一門解釋型的語言,特別是在瀏覽器中。然而這並不是定則,在Rhino中,腳本能夠被編譯爲Java字節碼。Google的V8引擎則直接將JavaScript代碼編譯爲本地代碼,無需解釋。
任何平臺均可以實現JavaScript,包括服務器端。不一樣平臺實現的ECMAScript方言不一樣,解釋引擎也不盡相同。歷史上第一款JavaScript解釋引擎名爲SpiderMonkey,Brendan Eich在Netscape時使用C語言編寫。
主要網頁瀏覽器的JavaScript引擎以下(摘自維基百科):
SpiderMonkey,第一款JavaScript引擎,由Brendan Eich在Netscape Communications時編寫,用於Mozilla Firefox。
TraceMonkey,基於實時編譯的引擎,其中部分代碼取自Tamarin引擎,用於Mozilla Firefox 3.5~3.6版本。
JaegerMonkey,德文Jäger原意爲獵人,結合追蹤和組合碼技術大幅提升性能,部分技術借鑿了V八、JavaScriptCore、WebKit,用於Mozilla Firefox 4.0~11版本。
IonMonkey,能夠對JavaScript編譯後的結果進行最優化,用於Mozilla Firefox 18.0以上版本。
OdinMonkey,能夠對asm.js進行最優化,用於Mozilla Firefox 22.0以上版本。
Rhino,由Mozilla基金會管理,開放源代碼,徹底以Java編寫。
V8,使用C++編寫,開放源代碼,由Google丹麥開發,是Google Chrome的一部分。
Chakra (JScript引擎),中文譯名爲查克拉,用於Internet Explorer 9的32位版本及Internet Explorer 10。
Linear A,用於Opera 4.0~6.1版本。
Linear B,用於Opera 7.0~9.2版本。
Futhark,用於Opera 9.5~10.2版本。
Carakan,用於Opera 10.50~14版本。
而在服務器端,例如node.js是一個基於Google V8 JavaScript引擎的框架。
總結
JavaSctipt引擎種類繁多,無獨有偶,在網頁瀏覽器中,HTML排版引擎(也稱爲瀏覽器內核)一樣是百家爭鳴,各放異彩。
現時主要的四大排版引擎爲:Trident(應用於IE);Gecko(應用於FF);Blink(應用於Chrome和Opera);WebKit (應用於Safari和早期版本的Chrome)。
此外,還有一些正在開發的排版引擎。
Servo是一個實驗性網頁瀏覽器排版引擎,由Mozilla所開發,三星集團移植到Android系統和ARM處理器。
EdgeHTML引擎是Trident的一個分支,將被用於Microsoft Edge瀏覽器(研發代號爲Project Spartan,常常簡寫爲 Spartan)。該瀏覽器將在 Windows 10 和 Windows 10移動版中取代IE成爲默認瀏覽器。
在前端開發中,CSS的兼容性問問每每是瀏覽器的排版引擎致使,而JavaScript兼容性問題則是由瀏覽器的JavaScript解釋引擎不一樣而造成。JavaScript的兼容問題多出如今DOM和BOM中,不一樣的排版引擎和JS解釋引擎的執行效率也是徹底不一致的,甚至能夠差到十倍以上。更有甚者,JavaScript解釋引擎自己也存在Bug,這也須要程序員去注意和避免。
瞭解了JavaScript的前世此生,才發現原來本身正在學習的JavaScript是一個怎樣的一門語言——20年前沒人能夠預料它會變得如此偉大。再次面對兼容性問題時,但願咱們都可以有的放矢,不要抱怨。
JavaScript:學會它,你只須要片刻,掌握它,你須要數年。
(完)