前言:最近在細讀Javascript高級程序設計,對於我而言,中文版,書中不少地方一筆帶過,因此用本身所理解的,嘗試細緻解讀下。若有紕漏或錯誤,會很是感謝您的指出。文中絕大部份內容引用自《JavaScript高級程序設計第三版》。html
JavaScript誕生於1995年。當時,它的主要目的是處理之前由有服務器語言(如Perl)負責的一些輸入驗證操做。程序員
在JavaScript問世以前,必須把表單數據發送到服務器端才能肯定用戶是否沒有填寫某個必填項,是否輸入了無效的值。正則表達式
Netscape Navigator但願經過JavaScript來解決這個問題。在人們廣泛使用電話撥號上網的年代,可以在客戶端完成一些基本的驗證任務絕對是使人興奮的。畢竟,撥號上網的速度之慢,致使了與服務器的每一次數據交換都成了對人們耐心的一次考驗。編程
自此之後,JavaScript逐漸成爲世面上常見瀏覽器必備的一項特點功能。現在,JavaScript的用途早再也不侷限於簡單的數據驗證,而是具有了與瀏覽器窗口及其內容等幾乎全部方面交互的能力。瀏覽器
今天的JavaScript已經成爲了一門功能全面的編程語言,可以處理複雜的計算和交互,擁有了閉包、匿名(lambda,拉姆達)函數,設置元編程等特性。服務器
做爲Web的一個重要組成部分,JavaScript的重要性是不言而喻的,就連手機瀏覽器,甚至那些專門爲殘障人士設計的很是規瀏覽器都支持它。cookie
固然,微軟的例子更爲典型。雖然有本身的客戶端腳本語言VBScript,但微軟仍然在Internet Explorer的早起版本中加入了本身的JavaScript實現。閉包
JavaScript從一個簡單的輸入驗證器發展成爲一門強大的編程語言,徹底出乎人們的意料。框架
它既是一門很是簡單的語言,又是一門很是複雜的語言。編程語言
說它簡單,是由於學會使用它只需片刻功夫;而說它複雜,是由於要真正掌握它須要數年時間。要想全面理解和掌握JavaScript,關鍵在於弄清楚它的本質、歷史和侷限性。
在Web日益流行的同時,人們對客戶端腳本語言的需求也愈來愈強烈。那個時候,絕大多數因特網用戶都使用速度僅爲28.8bit/s的「貓」(調制解調器)上網,但網頁的大小和複雜性卻不斷增長。
爲完成簡單的表單驗證而頻繁地獄服務器交換數據只會加劇用戶的負擔。想象一下:用戶填寫完一個表單,單擊「提交」按鈕,而後等待30秒鐘,最終服務器返回消息說有一個必填字段沒有填好.....當時走在技術革新最前沿的Netscape公司,決定着手可開發一種客戶端語言,用來處理這種簡單的驗證。
當時就任於Netscape公司的Brendan Eich,開始着手爲計劃於1995年2月發佈的Netscape Navigator 2 開發一種名爲 LiveScript的腳本語言——該語言將同時在瀏覽器和服務器中使用(它在服務器上的名字叫LiveWire)。爲了趕在發佈日期前完成LiveScript的開發,Netscape與Sun公司創建了一個開發聯盟。在Netscape Navigator 2正是發佈前夕,Netscape爲了搭上媒體熱炒Java的順風車,臨時把LiveScript更名爲JavaScript。
因爲JavaScript 1.0得到了巨大成功,NetScape隨即在Netscape Navigator 3中又發佈了JavaScript 1.1。Web雖然羽翼未豐,但用戶關注度卻屢創新高。在這樣的背景下,Netscape把本身定位爲市場領袖型公司。與此同時,微軟決定與Navigator競爭的自家產品Internet Explorer瀏覽器投入更多資源。Navigator 3 發佈後不久,微軟就在其Internet Expolorer 3中加入了名爲JScript的JavaScript實現(命名爲JScript是爲了避開與Netscape有關的受權問題)。以如今的眼光來看,微軟1996年8月爲進入Web瀏覽器領域而實施的這個重大舉措,是致使Netscape往後蒙羞的一個標誌性時間。這也標誌着JavaScript做爲一門語言,其開發向前邁進了一大步。
微軟推出其JavaScript實現意味着有了兩個不一樣的JavaScript版本:Netscape Navigator中的JavaScript、Internet Explorer中的JScript。
與C及其餘編程語言不一樣,當時尚未標準規定JavaScript的語法和特性,兩個不一樣版本並存的局面已經徹底暴露了這個問題。隨着頁面擔憂的日益加重,JavaScript的標準化問題被提上了議事日程。
1997年,以JavaScript 1.1 爲藍本的建議被提交給了歐洲計算機制造商協會(ECMA,European Computer Manufacturers Association)。該協會指定39號技術委員會(TC39,Technical Committee #39)負責「標準化一種通用、跨平臺、供應商中立的腳本語言的語法和語義」。TC39由來自Netscape、Sun、微軟、Borland及其餘關注腳本語言發展的公司的程序員組成,他們通過數月的努力完成了ECMA-262——定義一種名爲ECMAScript的新腳本語言的標準。
第二年,ISO/IEC(International Organization for Standardization and International Electrotechnical Commission,國際標準化組織和國際電工委員會)也採用了ECMAScript做爲標準(即ISO/IEC-16262)。自此以後,瀏覽器開發上就開始致力於將ECMAScript做爲各自JavaScript實現的基礎,也在不一樣程度上取得了成功。
雖然JavaScript和ECMAScript一般都被人們用來表達相同的含義,但JavaScript的含義卻比ECMA-262規定的要多得多。
一個完整的JavaScript實現應該由下列三個不一樣的部分組成。
由ECMA-262定義的ECMAScript與Web瀏覽器沒有依賴關係。實際上,這門語言自己並不包含輸入和輸出定義。ECMAScript-262定義的只是這門語言的基礎,而在此基礎之上能夠構建更完善的腳本語言。
咱們常見的Web瀏覽器只是ECMAScript實現可能的宿主環境之一。宿主環境不只提供基本的ECMAScript實現,同時也會提供該語言的擴展,以便語言與環境之間對接交互。而這些擴展——如DOM,則利用ECMAScript的核心類型和語法提供更多更具體的功能,以便實現針對環境的操做。其餘宿主環境包括Node(一種服務端JavaScript平臺)和Adobe Flash。
既然ECMA-262標準沒有參照Web瀏覽器,那它規定了些什麼內容?大體來講,它規定了這門語言的下列組成部分。
ECMAScript就是對實現該標準規定的各個方面內容的語言的描述。
JavaScript實現了ECMAScript,Adobe ActionScript一樣也實現了ECMAScript。
這裏只說下第五版。
ECMAScript 3.1成爲 ECMAScript-262第五版,並於2009年12月3日正式發佈。第5版力求澄清第3版中已知的歧義並增添了新的功能。新功能包括原生JSON對象(用於解析和序列化JSON數據)、繼承的方法和高級屬性定義,另外還包含一種嚴格模式,對ECMAScript引擎解釋和執行代碼進行了補充說明。
ECMA-262給出了ECMAScript兼容的定義。要想成爲ECMAScript的實現,則該實現必須作到:
此外,兼容的實現還能夠進行下列擴展。
到了2008年,五大主流Web瀏覽器(IE、Firefox、Safari、Chrome和Opera)所有作到了與ECMAScript-262兼容。IE8是第一個着手實現ECMAScript-262第5版的瀏覽器,並在IE9中提供了完整的支持。Firefox 4也緊隨其後作到兼容。
文檔對象模型(DOM,Document Object Model)是針對XML但通過擴展用於HTML的應用程序編程接口(API,Application Programming Interface)。DOM把整個頁面映射爲一個多層節點結構。HTML或XML頁面中的每一個組成部分都是某種類型的節點,這些節點又包含不一樣類型的數據。
<!DOCTYPE HTML> <html> <head> <title>Sample Page</title> </head> <body> <p>hello world</p> </body> </html>
經過DOM建立的這個表示文檔的樹形圖,開發人員得到了控制頁面內容和結構的主動權。藉助DOM提供的API,開發人員能夠輕鬆自如地刪除、添加、替換或修改任何節點。
在IE4和Netscape Navigator4分別支持的不一樣形式的DHTML(Dynamic HTML)基礎上,開發人員首次無需從新加載網頁,就能夠修改其外觀和內容了。然而,DHTML在給Web技術發展帶來巨大進步的同時,也帶來了巨大的問題。因爲Netscape和微軟在開發DHTML方面互不相讓,過去那個只編寫一個HTML頁面就可以在任何瀏覽器中運行的時代結束了。
對開發人員來講,若是想繼續保持Web跨平臺的天性,就必須額外多作些工做。而人們真正擔憂的是,若是不對Netscape和微軟加以控制,Web開發領域就會出現技術上兩強割據,瀏覽器互不兼容的局面。
此時,負責制定Web通訊標準的W3C(World Wide Web Consortium,萬維網聯盟)開始着手規劃DOM。
DOM1級(DOM Level1)於1998年10月成爲W3C的推薦標準。DOM1級由兩個模塊組成:DOM核心(DOM Core)和DOM HTML。
其中,DOM核心規定的是如何映射基於XML的文檔結構,以便簡化對文檔中任意部分的訪問和操做。
DOM HTML模塊則在DOM核心的基礎上加以擴展,添加了針對HTML的對象和方法。
DOM並不僅是針對JavaScript的,不少別的語言月都實現了DOM。不過,在Web瀏覽器中,基於ECMAScript實現的DOM的確已經成爲JavaScript這門語言的一個重要組成部分。
若是說DOM1級的目標主要是映射文檔的結構,那麼DOM2級的目標就要寬泛多了。DOM2級在原來DOM的基礎上又擴展了鼠標和用戶界面時間、範圍、遍歷(迭代DOM文檔的方法)等細分模塊,並且經過對象接口增長了對CSS(Cascading Style Sheets,層疊樣式表)的支持。DOM1級中的DOM核心模塊也通過擴展開始支持XML命名空間。
DOM2級引入了下列新模塊,也給出了衆多新類型和新接口的定義。
DOM3級則進一步擴展了DOM,引入了以統一方式加載和保存文檔的方法——在DOM加載和保存(DOM Load and Save)模塊中定義;
新增了驗證文檔的方法——在DOM驗證(DOM Validation)模塊中定義。DOM3級也對DOM核心進行了擴展,開始支持XML 1.0規範,涉及XML Infoset、XPath和XML Base。
在閱讀相關參考文檔的時候,可能會看到DOM0級(DOM Level 0)的字眼。實際上,DOM0級標準是不存在的;所謂DOM0級只是DOM歷史座標中的一個參照點而已。具體來講,DOM0級指的是IE 4和Natscape Navigator 最初支持的DHTML。
除了DOM核心和DOM HTML接口以外,另外幾種語言還發布了只針對本身的DOM標準。下面列出的語言都是基於XML的,每種語言的DOM標準都添加了與特定語言相關的新方法和新街口:
還有一些語言也開發了本身的DOM實現,例如Mozilla的XUL(XML User Interfacce Language,XML用戶界面語言)。可是,只有上面列出的幾種語言是W3C的推薦標準。
在DOM標準出現了一段時間後,Web瀏覽器纔開始實現它。微軟IE5首次嘗試實現DOM,知道IE5.5纔算是真正支持DOM1級。在隨後的IE6和IE7中,微軟都沒有引入新的DOM功能,而到了IE8纔對之前DOM實現中的bug進行了修復。
Netscape直到Netscape6(Mozilla 0.60)纔開始支持DOM。在Netscape7以後,Mozilla把開發中心轉向了Firefox瀏覽器。Firefox 3完成支持DOM1級,幾乎徹底支持DOM2級,甚至還支持DOM3級的一部分。(Mozilla開發團隊的目標是構建與標準100%兼容的瀏覽器,而他們的努力也獲得了回報。)
支持DOM已經成爲瀏覽器開發商的首要目標,主流瀏覽器每次發佈新版本都會改進對DOM的支持。
IE3和Netscape Navigator 3有一個共同的特點,那就是支持能夠訪問和草祖宗瀏覽器窗口的瀏覽器對象模型(BOM,Broswer Object Model)。開發人員使用BOM能夠可控制瀏覽器顯示的頁面之外的部分。而BOM真正不同凡響的地方(也是常常會致使問題的地方),仍是它做爲JavaScript實現的一部分但卻沒有相關標準。這個問題在HTML5中獲得瞭解決,HTML5致力於把不少BOM功能寫入正式規範。
HTML5發佈後,不少關於BOM的困惑煙消雲散。
從根本上講,BOM只處理瀏覽器窗口和框架,但人們習慣上也把全部針對瀏覽器的JavaScript擴展算做BOM的一部分。
因爲沒有BOM標準能夠遵循,所以每一個瀏覽器都有本身的實現。
雖然也存在一些事實標準,例如、要有window對象和navigator對象等,但每一個瀏覽器都會爲這兩個對象乃至其餘對象定義本身的屬性和方法。
JavaScript是一種專爲與網頁交互而設計的腳本語言,由下列三個不一樣的部分組成:
JavaScript的這三個組成部分,在當前五個主流瀏覽器(IE,FF,Chrome, Safari和Opera)中都獲得了不一樣程度的支持。
對已經正式歸入HTML5標準的BOM來講,儘管各瀏覽器都實現了某些衆所周知的共同特性,但其餘特性仍是因瀏覽器而異。