- JavaScript 誕生于1995 年。當時玉锌,它的主要目的是處理以前由服務器端語言(如Perl)負責的一些輸入驗證操作。在JavaScript 問世之前,必須把表單數(shù)據(jù)發(fā)送到服務器端才能確定用戶是否沒有填寫某個必填域泌类,是否輸入了無效的值。Netscape Navigator 希望通過JavaScript 來解決這個問題底燎。在人們普遍使用電話拔號上網(wǎng)的年代刃榨,能夠在客戶端完成一些基本的驗證任務絕對是令人興奮的。畢竟双仍,撥號上網(wǎng)的速度之慢枢希,導致了與服務器的每一次數(shù)據(jù)交換事實上都成了對人們耐心的一次考驗。
- 自此以后朱沃,JavaScript 逐漸成為市面上常見瀏覽器必備的一項特色功能苞轿。如今茅诱,JavaScript 的用途早已不再局限于簡單的數(shù)據(jù)驗證,而是具備了與瀏覽器窗口及其內(nèi)容等幾乎所有方面交互的能力搬卒。今天的JavaScript 已經(jīng)成為一門功能全面的編程語言瑟俭,能夠處理復雜的計算和交互,擁有了閉包秀睛、匿名(lamda尔当,拉姆達)函數(shù),甚至元編程等特性蹂安。作為Web 的一個重要組成部分椭迎,JavaScript 的重要性是不言而喻的,就連手機瀏覽器田盈,甚至那些專為殘障人士設(shè)計的瀏覽器等非常規(guī)瀏覽器都支持它畜号。當然,微軟的例子更為典型允瞧。雖然有自己的客戶端腳本語言VBScript简软,但微軟仍然在Internet Explorer 的早期版本中加入了自己的JavaScript 實現(xiàn)。
- JavaScript 從一個簡單的輸入驗證器發(fā)展成為一門強大的編程語言述暂,完全出乎人們的意料痹升。應該說,它既是一門非常簡單的語言畦韭,又是一門非常復雜的語言疼蛾。說它簡單,是因為學會使用它只需片刻功夫艺配;而說它復雜察郁,是因為要真正掌握它則需要數(shù)年時間。要想全面理解和掌握JavaScript转唉,關(guān)鍵在于弄清楚它的本質(zhì)皮钠、歷史和局限性。
一赠法、JavaScript 簡史
- 在Web 日益流行的同時麦轰,人們對客戶端腳本語言的需求也越來越強烈。那個時候砖织,絕大多數(shù)因特網(wǎng)用戶都使用速度僅為28.8kbit/s 的“貓”(調(diào)制解調(diào)器)上網(wǎng)原朝,但網(wǎng)頁的大小和復雜性卻不斷增加。為完成簡單的表單驗證而頻繁地與服務器交換數(shù)據(jù)只會加重用戶的負擔镶苞。想象一下:用戶填寫完一個表單,單擊“提交”按鈕鞠评,然后等待30 秒鐘茂蚓,最終服務器返回消息說有一個必填字段沒有填好……當時走在技術(shù)革新最前沿的Netscape 公司,決定著手開發(fā)一種客戶端語言,用來處理這種簡單的驗證聋涨。
- 當時就職于Netscape 公司的布蘭登·艾奇(Brendan Eich)晾浴,開始著手為計劃于1995 年2 月發(fā)布的Netscape Navigator 2 開發(fā)一種名LiveScript 的腳本語言——該語言將同時在瀏覽器和服務器中使用(它在服務器上的名字叫LiveWire)。為了趕在發(fā)布日期前完成LiveScript 的開發(fā)Netscape 與Sun 公司建立了一個開發(fā)聯(lián)盟牍白。在Netscape Navigator 2 正式發(fā)布前夕脊凰,Netscape 為了搭上媒體熱炒Java 的順風車,臨時把LiveScript 改名為JavaScript茂腥。
- 由于JavaScript 1.0 獲得了巨大成功狸涌,Netscape 隨即在Netscape Navigator 3 中又發(fā)布了JavaScript 1.1。Web 雖然羽翼未豐最岗,但用戶關(guān)注度卻屢創(chuàng)新高帕胆。在這樣的背景下,Netscape 把自己定位為市場領(lǐng)袖型公司般渡。與此同時懒豹,微軟決定向與Navigator 競爭的自家產(chǎn)品Internet Explorer 瀏覽器投入更多資源。NetscapeNavigator 3 發(fā)布后不久驯用,微軟就在其Internet Explorer 3 中加入了名為JScript 的JavaScript 實現(xiàn)(命名為JScript 是為了避開與Netscape 有關(guān)的授權(quán)問題)脸秽。以現(xiàn)在的眼光來看,微軟1996 年8 月為進入Web 瀏覽器領(lǐng)域而實施的這個重大舉措蝴乔,是導致Netscape 日后蒙羞的一個標志性事件记餐。然而,這個重大舉措同時也標志著JavaScript 作為一門語言淘这,其開發(fā)向前邁進了一大步剥扣。
- 微軟推出其JavaScript 實現(xiàn)意味著有了兩個不同的JavaScript 版本:Netscape Navigator 中的JavaScript、Internet Explorer 中的JScript铝穷。與C 及其他編程語言不同钠怯,當時還沒有標準規(guī)定JavaScript 的語法和特性,兩個不同版本并存的局面已經(jīng)完全暴露了這個問題曙聂。隨著業(yè)界擔心的日益加劇晦炊,JavaScript的標準化問題被提上了議事日程。
- 1997 年宁脊,以JavaScript 1.1 為藍本的建議被提交給了歐洲計算機制造商協(xié)會(ECMA断国,EuropeanComputer Manufacturers Association)。該協(xié)會指定39 號技術(shù)委員會(TC39榆苞,Technical Committee #39)負責“ 標準化一種通用稳衬、跨平臺、供應商中立的腳本語言的語法和語義”坐漏。TC39 由來自Netscape薄疚、Sun碧信、微軟、Borland 及其他關(guān)注腳本語言發(fā)展的公司的程序員組成街夭,他們經(jīng)過數(shù)月的努力完成了ECMA-262——定義一種名為ECMAScript(發(fā)音為“ek-ma-script”)的新腳本語言的標準砰碴。
- 第二年,ISO/IEC(International Organization for Standardization and International ElectrotechnicalCommission板丽,國標標準化組織和國際電工委員會)也采用了ECMAScript 作為標準(即ISO/IEC-16262)呈枉。自此以后,瀏覽器開發(fā)商就開始致力于將ECMAScript 作為各自JavaScript 實現(xiàn)的基礎(chǔ)埃碱,也在不同程度上取得了成功猖辫。
二、JavaScript 實現(xiàn)
雖然JavaScript 和ECMAScript 通常都被人們用來表達相同的含義乃正,但JavaScript 的含義卻比ECMA-262 中規(guī)定的要多得多住册。沒錯,一個完整的JavaScript 實現(xiàn)應該由下列三個不同的部分組成:
- 核心(ECMAScript)
- 文檔對象模型(DOM)
瀏覽器對象模型(BOM)
- ECMAScript
- 由ECMA-262 定義的ECMAScript 與Web 瀏覽器沒有依賴關(guān)系瓮具。實際上荧飞,這門語言本身并不包含輸入和輸出定義。ECMA-262 定義的只是這門語言的基礎(chǔ)名党,而在此基礎(chǔ)之上可以構(gòu)建更完善的腳本語言叹阔。我們常見的Web 瀏覽器只是ECMAScript 實現(xiàn)可能的宿主環(huán)境之一。宿主環(huán)境不僅提供基本的ECMAScript 實現(xiàn)传睹,同時也會提供該語言的擴展耳幢,以便語言與環(huán)境之間對接交互。而這些擴展——如DOM欧啤,則利用ECMAScript 的核心類型和語法提供更多更具體的功能睛藻,以便實現(xiàn)針對環(huán)境的操作。其他宿主環(huán)境包括Node(一種服務端JavaScript 平臺)和Adobe Flash邢隧。
- 既然ECMA-262 標準沒有參照Web 瀏覽器店印,那它都規(guī)定了些什么內(nèi)容呢?大致說來倒慧,它規(guī)定了這門語言的下列組成部分:
- 語法
- 類型
- 語句
- 關(guān)鍵字
- 保留字
- 操作符
- 對象
- ECMAScript 就是對實現(xiàn)該標準規(guī)定的各個方面內(nèi)容的語言的描述按摘。JavaScript 實現(xiàn)了ECMAScript,Adobe ActionScript 同樣也實現(xiàn)了ECMAScript纫谅。
- 文檔對象模型(DOM)
- 文檔對象模型(DOM炫贤,Document Object Model)是針對XML 但經(jīng)過擴展用于HTML 的應用程序編程接口(API,Application Programming Interface)付秕。DOM把整個頁面映射為一個多層節(jié)點結(jié)構(gòu)兰珍。HTML或XML 頁面中的每個組成部分都是某種類型的節(jié)點,這些節(jié)點又含著不同類型的數(shù)據(jù)询吴。
- 瀏覽器對象模型(BOM)
- Internet Explorer 3 和Netscape Navigator 3 有一個共同的特色俩垃,那就是支持可以訪問和操作瀏覽器窗口的瀏覽器對象模型(BOM励幼,Browser Object Model)。開發(fā)人員使用BOM 可以控制瀏覽器顯示的頁面以外的部分口柳。而BOM 真正與眾不同的地方(也是經(jīng)常會導致問題的地方),還是它作為JavaScript 實現(xiàn)的一部分但卻沒有相關(guān)的標準有滑。這個問題在HTML5 中得到了解決跃闹,HTML5 致力于把很多BOM 功能寫入正式規(guī)范。HTML5 發(fā)布后毛好,很多關(guān)于BOM 的困惑煙消云散望艺。
- 從根本上講,BOM 只處理瀏覽器窗口和框架肌访;但人們習慣上也把所有針對瀏覽器的JavaScript 擴展算作BOM的一部分找默。下面就是一些這樣的擴展:
- 彈出新瀏覽器窗口的功能;
- 移動吼驶、縮放和關(guān)閉瀏覽器窗口的功能惩激;
- 提供瀏覽器詳細信息的navigator 對象;
- 提供瀏覽器所加載頁面的詳細信息的location 對象蟹演;
- 提供用戶顯示器分辨率詳細信息的screen 對象风钻;
- 對cookies 的支持;
- 像XMLHttpRequest 和IE 的ActiveXObject 這樣的自定義對象酒请。
- 由于沒有BOM標準可以遵循骡技,因此每個瀏覽器都有自己的實現(xiàn)。雖然也存在一些事實標準羞反,例如要有window 對象和navigator 對象等布朦,但每個瀏覽器都會為這兩個對象乃至其他對象定義自己的屬性和方法。現(xiàn)在有了HTML5昼窗,BOM 實現(xiàn)的細節(jié)有望朝著兼容性越來越高的方向發(fā)展是趴。
三、JavaScript 版本
作為Netscape“繼承人”的Mozilla 公司膏秫,是目前唯一還在沿用最初的JavaScript 版本編號序列的瀏覽器開發(fā)商右遭。在Netscape 將源代碼提交給開源的Mozilla 項目的時候,JavaScript 在瀏覽器中的最后一個版本號是1.3缤削。(如前所述窘哈,1.4 版是只針對服務器的實現(xiàn)。)后來亭敢,隨著Mozilla 基金會繼續(xù)開發(fā)JavaScript滚婉,添加新的特性、關(guān)鍵字和語法帅刀,JavaScript 的版本號繼續(xù)遞增让腹。下表列出了Netscape/Mozilla 瀏覽器中JavaScript 版本號的遞增過程:
- 實際上远剩,上表中的編號方案源自Firefox 4 將內(nèi)置JavaScript 2.0 這一共識。因此骇窍,2.0 版之前每個遞增的版本號瓜晤,表示的是相應實現(xiàn)與JavaScript 2.0 開發(fā)目標還有多大的距離。雖然原計劃是這樣腹纳,但JavaScript 的這種發(fā)展速度讓這個計劃不再可行痢掠。目前,JavaScript 2.0 還沒有目標實現(xiàn)嘲恍。
四足画、小結(jié)
- JavaScript 是一種專為與網(wǎng)頁交互而設(shè)計的腳本語言,由下列三個不同的部分組成:
- ECMAScript佃牛,由ECMA-262 定義淹辞,提供核心語言功能;
- 文檔對象模型(DOM)俘侠,提供訪問和操作網(wǎng)頁內(nèi)容的方法和接口象缀;
- 瀏覽器對象模型(BOM),提供與瀏覽器交互的方法和接口兼贡。
- JavaScript 的這三個組成部分攻冷,在當前五個主要瀏覽器(IE、Firefox遍希、Chrome等曼、Safari 和Opera)中都得到了不同程度的支持。其中凿蒜,所有瀏覽器對ECMAScript 第3 版的支持大體上都還不錯禁谦,而對ECMAScript 5 的支持程度越來越高,但對DOM 的支持則彼此相差比較多废封。對已經(jīng)正式納入HTML5 標準的BOM來說州泊,盡管各瀏覽器都實現(xiàn)了某些眾所周知的共同特性,但其他特性還是會因瀏覽器而異漂洋。