http://www.nowamagic.net/librarys/veda/detail/1579javascript
昨天收到一封來自深圳的一位前端童鞋的郵件,郵件內容以下(很抱歉,未通過他的容許,公開郵件內容,不過我相信其餘人確定也有一樣的問題,因此,直接把問題原文拋出來):html
「讀了你的幾篇關於JS(變量對象、做用域、上下文、執行代碼)的文章,我我的以爲有點抽象,難以深入理解。我想請教下經過什麼途徑可以深刻點的瞭解javascript解析引擎在執行代碼先後是怎麼工做的,ecma英文版實在看不下去呵呵。」前端
其實這個問題我的以爲太籠統了,直接回答很難回答,因此,我打算先把他的問題拆解成以下幾個子問題,並對其表達我的的觀點,但願對有一樣困惑的童鞋可以有所幫助。java
簡單地說,JavaScript解析引擎就是可以「讀懂」JavaScript代碼,並準確地給出代碼運行結果的一段程序。比方說,當你寫了 var a = 1 + 1; 這樣一段代碼,JavaScript引擎作的事情就是看懂(解析)你這段代碼,而且將a的值變爲2。算法
學過編譯原理的人都知道,對於靜態語言來講(如Java、C++、C),處理上述這些事情的叫編譯器(Compiler),相應地對於JavaScript這樣的動態語言則叫解釋器(Interpreter)。這二者的區別用一句話來歸納就是:編譯器是將源代碼編譯爲另一種代碼(好比機器碼,或者字節碼),而解釋器是直接解析並將代碼運行結果輸出。 比方說,firebug的console就是一個JavaScript的解釋器。瀏覽器
可是,如今很難去界定說,JavaScript引擎它到底算是個解釋器仍是個編譯器,由於,好比像V8(Chrome的JS引擎),它其實爲了提升JS的運行性能,在運行以前會先將JS編譯爲本地的機器碼(native machine code),而後再去執行機器碼(這樣速度就快不少),相信你們對JIT(Just In Time Compilation)必定不陌生吧。閉包
我我的認爲,不須要過度去強調JavaScript解析引擎究竟是什麼,瞭解它究竟作了什麼事情我我的認爲就能夠了。對於編譯器或者解釋器到底是如何看懂代碼的,翻出大學編譯課的教材就能夠了。函數
這裏還要強調的就是,JavaScript引擎自己也是程序,代碼編寫而成。好比V8就是用C/C++寫的。性能
JavaScript引擎是一段程序,咱們寫的JavaScript代碼也是程序,如何讓程序去讀懂程序呢?這就須要定義規則。好比,以前提到的var a = 1 + 1;,它表示:學習
上述這些就是規則,有了它就等於有了衡量的標準,JavaScript引擎就能夠根據這個標準去解析JavaScript代碼了。那麼這裏的ECMAScript就是定義了這些規則。其中ECMAScript 262這份文檔,就是對JavaScript這門語言定義了一整套完整的標準。其中包括:
注:js兼容性問題的緣由
標準的JavaScript引擎就會根據這套文檔去實現,注意這裏強調了標準,由於也有不按照標準來實現的,好比IE的JS引擎。這也是爲何JavaScript會有兼容性的問題。至於爲何IE的JS引擎不按照標準來實現,就要說到瀏覽器大戰了,這裏就不贅述了,自行Google之。
因此,簡單的說,ECMAScript定義了語言的標準,JavaScript引擎根據它來實現,這就是二者的關係。
簡單地說,JavaScript引擎是瀏覽器的組成部分之一。由於瀏覽器還要作不少別的事情,好比解析頁面、渲染頁面、Cookie管理、歷史記錄等等。那麼,既然是組成部分,所以通常狀況下JavaScript引擎都是瀏覽器開發商自行開發的。好比:IE9的Chakra、Firefox的TraceMonkey、Chrome的V8等等。
從而也看出,不一樣瀏覽器都採用了不一樣的JavaScript引擎。所以,咱們只能說要深刻了解哪一個JavaScript引擎。
搞清楚了前面三個問題,那這個問題就好回答了。我的認爲,主要途徑有以下幾種(依次由淺入深):
其實第一種方式中的文章,做者已經將文檔中內容提煉出來,用通俗易懂的方式闡述出來了。若是,看起來還以爲吃力,那說明還缺乏兩塊的東西:
以上就是我的對這個問題的見解,除此以外,我以爲,學習任何技術都不能操之過急,要把基礎打紮實了,這樣學什麼都會很快。