第 1 章 什么是 JavaScript

1995 年,JavaScript 問世。當(dāng)時(shí),它的主要用途是代替 Perl 等服務(wù)器端語言處理輸入驗(yàn)證。在此之

前,要驗(yàn)證某個(gè)必填字段是否已填寫,或者某個(gè)輸入的值是否有效,需要與服務(wù)器的一次往返通信。網(wǎng)

景公司希望通過在其 Navigator 瀏覽器中加入 JavaScript 來改變這個(gè)局面。在那個(gè)普遍通過電話撥號(hào)上網(wǎng)

的年代,由客戶端處理某些基本的驗(yàn)證是讓人興奮的新功能。緩慢的網(wǎng)速讓頁面每次刷新都考驗(yàn)著人們

的耐心。

從那時(shí)起,JavaScript 逐漸成為市面上所有主流瀏覽器的標(biāo)配。如今,JavaScript 的應(yīng)用也不再局限

于數(shù)據(jù)驗(yàn)證,而是滲透到瀏覽器窗口及其內(nèi)容的方方面面。JavaScript 已被公認(rèn)為主流的編程語言,能

夠?qū)崿F(xiàn)復(fù)雜的計(jì)算與交互,包括閉包、匿名(lambda)函數(shù),甚至元編程等特性。不僅是桌面瀏覽器,

手機(jī)瀏覽器和屏幕閱讀器也支持 JavaScript,其重要性可見一斑。就連擁有自家客戶端腳本語言 VBScript

的微軟公司,也在其 Internet Explorer(以下簡(jiǎn)稱 IE)瀏覽器最初的版本中包含了自己的 JavaScript 實(shí)現(xiàn)。

從簡(jiǎn)單的輸入驗(yàn)證腳本到強(qiáng)大的編程語言,JavaScript 的崛起沒有任何人預(yù)測(cè)到。它很簡(jiǎn)單,學(xué)會(huì)

用只要幾分鐘;它又很復(fù)雜,掌握它要很多年。要真正學(xué)好用好 JavaScript,理解其本質(zhì)、歷史及局限

性是非常重要的。

1.1 簡(jiǎn)短的歷史回顧

隨著 Web 日益流行,對(duì)客戶端腳本語言的需求也越來越強(qiáng)烈。當(dāng)時(shí),大多數(shù)用戶使用 28.8kbit/s的

調(diào)制解調(diào)器上網(wǎng),但網(wǎng)頁變得越來越大、越來越復(fù)雜。為驗(yàn)證簡(jiǎn)單的表單而需要大量與服務(wù)器的往返通

信成為用戶的痛點(diǎn)。想象一下,你填寫完表單,單擊“提交”按鈕,等 30 秒處理,然后看到一條消息,

告訴你有一個(gè)必填字段沒填。網(wǎng)景在當(dāng)時(shí)是引領(lǐng)技術(shù)革新的公司,它將開發(fā)一個(gè)客戶端腳本語言來處理

這種簡(jiǎn)單的數(shù)據(jù)驗(yàn)證提上了日程。

1995 年,網(wǎng)景公司一位名叫 Brendan Eich 的工程師,開始為即將發(fā)布的 Netscape Navigator 2 開發(fā)一

個(gè)叫 Mocha(后來改名為 LiveScript)的腳本語言。當(dāng)時(shí)的計(jì)劃是在客戶端和服務(wù)器端都使用它,它在

服務(wù)器端叫 LiveWire。

為了趕上發(fā)布時(shí)間,網(wǎng)景與 Sun 公司結(jié)為開發(fā)聯(lián)盟,共同完成 LiveScript 的開發(fā)。就在 Netscape

Navigator 2正式發(fā)布前,網(wǎng)景把 LiveScript改名為 JavaScript,以便搭上媒體當(dāng)時(shí)熱烈炒作 Java的順風(fēng)車。由于 JavaScript 1.0 很成功,網(wǎng)景又在 Netscape Navigator 3 中發(fā)布了 1.1 版本。尚未成熟的 Web 的受

歡迎程度達(dá)到了歷史新高,而網(wǎng)景則穩(wěn)居市場(chǎng)領(lǐng)導(dǎo)者的位置。這時(shí)候,微軟決定向 IE 投入更多資源。

就在 Netscape Navigator 3發(fā)布后不久,微軟發(fā)布了 IE3,其中包含自己名為 JScript(叫這個(gè)名字是為了

避免與網(wǎng)景發(fā)生許可糾紛)的 JavaScript 實(shí)現(xiàn)。1996 年 8 月,微軟重磅進(jìn)入 Web 瀏覽器領(lǐng)域,這是網(wǎng)景

永遠(yuǎn)的痛,但它代表 JavaScript 作為一門語言向前邁進(jìn)了一大步。

微軟的 JavaScript 實(shí)現(xiàn)意味著出現(xiàn)了兩個(gè)版本的 JavaScript:Netscape Navigator 中的 JavaScript,以

及 IE 中的 JScript。與 C 語言以及很多其他編程語言不同,JavaScript 還沒有規(guī)范其語法或特性的標(biāo)準(zhǔn),

兩個(gè)版本并存讓這個(gè)問題更加突出了。隨著業(yè)界擔(dān)憂日甚,JavaScript 終于踏上了標(biāo)準(zhǔn)化的征程。

1997 年,JavaScript 1.1 作為提案被提交給歐洲計(jì)算機(jī)制造商協(xié)會(huì)(Ecma)。第 39 技術(shù)委員會(huì)(TC39)

承擔(dān)了“標(biāo)準(zhǔn)化一門通用、跨平臺(tái)、廠商中立的腳本語言的語法和語義”的任務(wù)(參見 TC39-ECMAScript)。

TC39 委員會(huì)由來自網(wǎng)景、Sun、微軟、Borland、Nombas和其他對(duì)這門腳本語言有興趣的公司的工程師

組成。他們花了數(shù)月時(shí)間打造出 ECMA-262,也就是 ECMAScript(發(fā)音為“ek-ma-script”)這個(gè)新的腳

本語言標(biāo)準(zhǔn)。

1998 年,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)也將 ECMAScript 采納為標(biāo)準(zhǔn)(ISO/

IEC-16262)。自此以后,各家瀏覽器均以 ECMAScript 作為自己 JavaScript 實(shí)現(xiàn)的依據(jù),雖然具體實(shí)現(xiàn)

各有不同。

1.2 JavaScript 實(shí)現(xiàn)

雖然JavaScript和ECMAScript基本上是同義詞,但JavaScript遠(yuǎn)遠(yuǎn)不限于ECMA-262所定義的那樣。

沒錯(cuò),完整的 JavaScript 實(shí)現(xiàn)包含以下幾個(gè)部分(見圖 1-1):

?? 核心(ECMAScript)

?? 文檔對(duì)象模型(DOM)

?? 瀏覽器對(duì)象模型(BOM)

1.2.1 ECMAScript

ECMAScript,即 ECMA-262 定義的語言,并不局限于 Web 瀏覽器。事實(shí)上,這門語言沒有輸入和 輸出之類的方法。ECMA-262 將這門語言作為一個(gè)基準(zhǔn)來定義,以便在它之上再構(gòu)建更穩(wěn)健的腳本語言。 Web 瀏覽器只是 ECMAScript 實(shí)現(xiàn)可能存在的一種宿主環(huán)境(host environment)。宿主環(huán)境提供 ECMAScript 的基準(zhǔn)實(shí)現(xiàn)和與環(huán)境自身交互必需的擴(kuò)展。擴(kuò)展(比如 DOM)使用 ECMAScript 核心類型 和語法,提供特定于環(huán)境的額外功能。其他宿主環(huán)境還有服務(wù)器端 JavaScript 平臺(tái) Node.js 和即將被淘汰

的 Adobe Flash。

如果不涉及瀏覽器的話,ECMA-262 到底定義了什么?在基本的層面,它描述這門語言的如下部分: ? 語法

? 類型

? 語句

? 關(guān)鍵字

? 保留字

? 操作符

? 全局對(duì)象

ECMAScript 只是對(duì)實(shí)現(xiàn)這個(gè)規(guī)范描述的所有方面的一門語言的稱呼。 JavaScript 實(shí)現(xiàn)了 ECMAScript,而 Adobe ActionScript 同樣也實(shí)現(xiàn)了 ECMAScript。

1. ECMAScript 版本

ECMAScript 不同的版本以“edition”表示(也就是描述特定實(shí)現(xiàn)的 ECMA-262 的版本)。ECMA-262 最近的版本是第 10 版,發(fā)布于 2019 年 6 月。ECMA-262 的第 1 版本質(zhì)上跟網(wǎng)景的 JavaScript 1.1 相同, 只不過刪除了所有瀏覽器特定的代碼,外加少量細(xì)微的修改。ECMA-262 要求支持 Unicode 標(biāo)準(zhǔn)(以支 持多語言),而且對(duì)象要與平臺(tái)無關(guān)(Netscape JavaScript 1.1 的對(duì)象不是這樣,比如它的 Date 對(duì)象就依 賴平臺(tái))。這也是 JavaScript 1.1 和 JavaScript 1.2 不符合 ECMA-262 第 1 版要求的原因。

ECMA-262 第 2 版只是做了一些編校工作,主要是為了更新之后嚴(yán)格符合 ISO/IEC-16262 的要求, 并沒有增減或改變?nèi)魏翁匦?。ECMAScript 實(shí)現(xiàn)通常不使用第 2 版來衡量符合性(conformance)。

ECMA-262 第 3 版第一次真正對(duì)這個(gè)標(biāo)準(zhǔn)進(jìn)行更新,更新了字符串處理、錯(cuò)誤定義和數(shù)值輸出。此 外還增加了對(duì)正則表達(dá)式、新的控制語句、try/catch 異常處理的支持,以及為了更好地讓標(biāo)準(zhǔn)國(guó)際化 所做的少量修改。對(duì)很多人來說,這標(biāo)志著 ECMAScript 作為一門真正的編程語言的時(shí)代終于到來了。

ECMA-262 第 4 版是對(duì)這門語言的一次徹底修訂。作為對(duì) JavaScript 在 Web 上日益成功的回應(yīng),開 發(fā)者開始修訂 ECMAScript 以滿足全球 Web 開發(fā)日益增長(zhǎng)的需求。為此,Ecma T39 再次被召集起來, 以決定這門語言的未來。結(jié)果,他們制定的規(guī)范幾乎在第 3 版基礎(chǔ)上完全定義了一門新語言。第 4 版包 括強(qiáng)類型變量、新語句和數(shù)據(jù)結(jié)構(gòu)、真正的類和經(jīng)典的繼承,以及操作數(shù)據(jù)的新手段。

與此同時(shí),TC39 委員會(huì)的一個(gè)子委員會(huì)也提出了另外一份提案,叫作“ECMAScript 3.1”,只對(duì)這 門語言進(jìn)行了較少的改進(jìn)。這個(gè)子委員會(huì)的人認(rèn)為第 4 版對(duì)這門語言來說跳躍太大了。因此,他們提出 了一個(gè)改動(dòng)較小的提案,只要在現(xiàn)有 JavaScript 引擎基礎(chǔ)上做一些增改就可以實(shí)現(xiàn)。最終,ES3.1 子委員 會(huì)贏得了 TC39 委員會(huì)的支持,ECMA-262 第 4 版在正式發(fā)布之前被放棄。

ECMAScript 3.1 變成了 ECMA-262 的第 5 版,于 2009 年 12 月 3 日正式發(fā)布。第 5 版致力于厘清 第 3 版存在的歧義,也增加了新功能。新功能包括原生的解析和序列化 JSON 數(shù)據(jù)的 JSON 對(duì)象、方便 繼承和高級(jí)屬性定義的方法,以及新的增強(qiáng) ECMAScript 引擎解釋和執(zhí)行代碼能力的嚴(yán)格模式。第 5 版 在 2011 年 6 月發(fā)布了一個(gè)維護(hù)性修訂版,這個(gè)修訂版只更正了規(guī)范中的錯(cuò)誤,并未增加任何新的語言 或庫特性。

ECMA-262 第 6 版,俗稱 ES6、ES2015 或 ES Harmony(和諧版),于 2015 年 6 月發(fā)布。這一版包 含了大概這個(gè)規(guī)范有史以來最重要的一批增強(qiáng)特性。ES6 正式支持了類、模塊、迭代器、生成器、箭頭 函數(shù)、期約、反射、代理和眾多新的數(shù)據(jù)類型。

ECMA-262 第 7 版,也稱為 ES7 或 ES2016,于 2016 年 6 月發(fā)布。這次修訂只包含少量語法層面的 增強(qiáng),如 Array.prototype.includes 和指數(shù)操作符。

ECMA-262 第 8 版,也稱為 ES8、ES2017,完成于 2017 年 6 月。這一版主要增加了異步函數(shù)(async/ await)、SharedArrayBuffer 及 Atomics API,以及 Object.values()/Object.entries()/Object. getOwnPropertyDescriptors()和字符串填充方法,另外明確支持對(duì)象字面量最后的逗號(hào)。

ECMA-262 第 9 版,也稱為 ES9、ES2018,發(fā)布于 2018 年 6 月。這次修訂包括異步迭代、剩余和 擴(kuò)展屬性、一組新的正則表達(dá)式特性、Promise finally(),以及模板字面量修訂。

ECMA-262 第 10 版,也稱為 ES10、ES2019,發(fā)布于 2019 年 6 月。這次修訂增加了 Array.prototype. flat()/flatMap()、String.prototype.trimStart()/trimEnd()、Object.fromEntries()方 法,以及 Symbol.prototype.description 屬性,明確定義了 Function.prototype.toString() 的返回值并固定了 Array.prototype.sort()的順序。另外,這次修訂解決了與 JSON 字符串兼容的 問題,并定義了 catch 子句的可選綁定。

2. ECMAScript 符合性是什么意思

ECMA-262 闡述了什么是 ECMAScript 符合性。要成為 ECMAScript 實(shí)現(xiàn),必須滿足下列條件: ? 支持 ECMA-262 中描述的所有“類型、值、對(duì)象、屬性、函數(shù),以及程序語法與語義”;

? 支持 Unicode 字符標(biāo)準(zhǔn)。

此外,符合性實(shí)現(xiàn)還可以滿足下列要求。

? 增加 ECMA-262 中未提及的“額外的類型、值、對(duì)象、屬性和函數(shù)”。ECMA-262 所說的這些額 外內(nèi)容主要指規(guī)范中未給出的新對(duì)象或?qū)ο蟮男聦傩浴?/p>

? 支持 ECMA-262 中沒有定義的“程序和正則表達(dá)式語法”(意思是允許修改和擴(kuò)展內(nèi)置的正則表 達(dá)式特性)。

以上條件為實(shí)現(xiàn)開發(fā)者基于 ECMAScript 開發(fā)語言提供了極大的權(quán)限和靈活度,也是其廣受歡迎的 原因之一。

3. 瀏覽器對(duì) ECMAScript 的支持

1996 年,Netscape Navigator 3 發(fā)布時(shí)包含了 JavaScript 1.1。JavaScript 1.1 規(guī)范隨后被提交給 Ecma, 作為對(duì)新的 ECMA-262 標(biāo)準(zhǔn)的建議。隨著 JavaScript 迅速走紅,網(wǎng)景非常愿意開發(fā) 1.2 版??墒怯袀€(gè)問 題:Ecma 尚未接受網(wǎng)景的建議。

Netscape Navigator 3 發(fā)布后不久,微軟推出了 IE3。IE 的這個(gè)版本包含了 JScript 1.0,本意是提供與 JavaScript 1.1 相同的功能。不過,由于缺少很多文檔,而且還有不少重復(fù)性功能,JScript 1.0 遠(yuǎn)遠(yuǎn)沒有 JavaScript 1.1 那么強(qiáng)大。

JScript 的再次更新出現(xiàn)在 IE4 中的 JScript 3.0(2.0 版是在 Microsoft Internet Information Server 3.0 中 發(fā)布的,但從未包含在瀏覽器中)。微軟發(fā)新聞稿稱 JScript 3.0 是世界上第一門真正兼容 Ecma 標(biāo)準(zhǔn)的腳 本語言。當(dāng)時(shí) ECMA-262 還沒制定完成,因此 JScript 3.0 遭受了與 JavaScript 1.2 同樣的命運(yùn),它同樣沒 有遵守最終的 ECMAScript 標(biāo)準(zhǔn)。

網(wǎng)景又在 Netscape Navigator 4.06 中將其 JavaScript 版本升級(jí)到 1.3,因此做到了與 ECMA-262 第 1 版完全兼容。JavaScript 1.3 增加了對(duì) Unicode 標(biāo)準(zhǔn)的支持,并做到了所有對(duì)象都與平臺(tái)無關(guān),同時(shí)保留

了 JavaScript 1.2 所有的特性。

后來,當(dāng)網(wǎng)景以 Mozilla 項(xiàng)目的名義向公眾發(fā)布其源代碼時(shí),人們都期待 Netscape Navigator 5 中會(huì) 包含 JavaScript 1.4??墒牵粋€(gè)完全重新設(shè)計(jì)網(wǎng)景代碼的激進(jìn)決定導(dǎo)致了人們的希望落空。JavaScript 1.4

只在 Netscape Enterprise Server 中作為服務(wù)器端語言發(fā)布了,從來就沒有進(jìn)入瀏覽器。到了 2008 年,五大瀏覽器(IE、Firefox、Safari、Chrome 和 Opera)全部兼容 ECMA-262 第 3 版。

IE8 率先實(shí)現(xiàn) ECMA-262 第 5 版,并在 IE9 中完整支持。Firefox 4 很快也做到了。

1.2.2 DOM

文檔對(duì)象模型(DOM,Document Object Model)是一個(gè)應(yīng)用編程接口(API),用于在 HTML 中使 用擴(kuò)展的 XML。DOM 將整個(gè)頁面抽象為一組分層節(jié)點(diǎn)。HTML 或 XML 頁面的每個(gè)組成部分都是一種 節(jié)點(diǎn),包含不同的數(shù)據(jù)。

DOM 通過創(chuàng)建表示文檔的樹,讓開發(fā)者可以隨心所欲地控制網(wǎng)頁的內(nèi)容和結(jié)構(gòu)。使用 DOM API, 可以輕松地刪除、添加、替換、修改節(jié)點(diǎn)。

1. 為什么 DOM 是必需的

在 IE4 和 Netscape Navigator 4 支持不同形式的動(dòng)態(tài) HTML(DHTML)的情況下,開發(fā)者首先可以 做到不刷新頁面而修改頁面外觀和內(nèi)容。這代表了 Web 技術(shù)的一個(gè)巨大進(jìn)步,但也暴露了很大的問題。 由于網(wǎng)景和微軟采用不同思路開發(fā) DHTML,開發(fā)者寫一個(gè) HTML 頁面就可以在任何瀏覽器中運(yùn)行的好 日子就此終結(jié)。

為了保持 Web 跨平臺(tái)的本性,必須要做點(diǎn)什么。人們擔(dān)心如果無法控制網(wǎng)景和微軟各行其是,那 么 Web 就會(huì)發(fā)生分裂,導(dǎo)致人們面向?yàn)g覽器開發(fā)網(wǎng)頁。就在這時(shí),萬維網(wǎng)聯(lián)盟(W3C,World Wide Web Consortium)開始了制定 DOM 標(biāo)準(zhǔn)的進(jìn)程。

2. DOM 級(jí)別

1998 年 10 月,DOM Level 1 成為 W3C 的推薦標(biāo)準(zhǔn)。這個(gè)規(guī)范由兩個(gè)模塊組成:DOM Core 和 DOM1998 年 10 月,DOM Level 1 成為 W3C 的推薦標(biāo)準(zhǔn)。這個(gè)規(guī)范由兩個(gè)模塊組成:DOM Core 和 DOMHTML。前者提供了一種映射 XML 文檔,從而方便訪問和操作文檔任意部分的方式;后者擴(kuò)展了前者,

并增加了特定于 HTML 的對(duì)象和方法。

注意 DOM 并非只能通過 JavaScript 訪問,而且確實(shí)被其他很多語言實(shí)現(xiàn)了。不過對(duì)于瀏

覽器來說,DOM就是使用 ECMAScript 實(shí)現(xiàn)的,如今已經(jīng)成為 JavaScript 語言的一大組成

部分。

DOM Level 1 的目標(biāo)是映射文檔結(jié)構(gòu),而 DOM Level 2 的目標(biāo)則寬泛得多。這個(gè)對(duì)最初 DOM 的擴(kuò)

展增加了對(duì)(DHTML 早就支持的)鼠標(biāo)和用戶界面事件、范圍、遍歷(迭代 DOM 節(jié)點(diǎn)的方法)的支

持,而且通過對(duì)象接口支持了層疊樣式表(CSS)。另外,DOM Level 1 中的 DOM Core 也被擴(kuò)展以包含

對(duì) XML 命名空間的支持。

DOM Level 2 新增了以下模塊,以支持新的接口。

?? DOM 視圖:描述追蹤文檔不同視圖(如應(yīng)用 CSS 樣式前后的文檔)的接口。

?? DOM 事件:描述事件及事件處理的接口。

?? DOM 樣式:描述處理元素 CSS 樣式的接口。

?? DOM 遍歷和范圍:描述遍歷和操作 DOM樹的接口。

DOM Level 3進(jìn)一步擴(kuò)展了 DOM,增加了以統(tǒng)一的方式加載和保存文檔的方法(包含在一個(gè)叫 DOM

Load and Save 的新模塊中),還有驗(yàn)證文檔的方法(DOM Validation)。在 Level 3 中,DOM Core 經(jīng)過擴(kuò)

展支持了所有 XML 1.0 的特性,包括 XML Infoset、XPath 和 XML Base。

目前,W3C 不再按照 Level 來維護(hù) DOM 了,而是作為 DOM Living Standard 來維護(hù),其快照稱為

DOM4。DOM4 新增的內(nèi)容包括替代 Mutation Events的 Mutation Observers。

注意 在閱讀關(guān)于 DOM的資料時(shí),你可能會(huì)看到 DOM Level 0 的說法。注意,并沒有一

個(gè)標(biāo)準(zhǔn)叫“DOM Level 0”,這只是 DOM 歷史中的一個(gè)參照點(diǎn)。DOM Level 0 可以看作 IE4

和 Netscape Navigator 4中最初支持的 DHTML。

3. 其他 DOM

除了 DOM Core 和 DOM HTML 接口,有些其他語言也發(fā)布了自己的 DOM 標(biāo)準(zhǔn)。下面列出的語言

是基于 XML 的,每一種都增加了該語言獨(dú)有的 DOM 方法和接口:

?? 可伸縮矢量圖(SVG,Scalable Vector Graphics)

?? 數(shù)學(xué)標(biāo)記語言(MathML,Mathematical Markup Language)

?? 同步多媒體集成語言(SMIL,Synchronized Multimedia Integration Language)

此外,還有一些語言開發(fā)了自己的 DOM 實(shí)現(xiàn),比如 Mozilla 的 XML 用戶界面語言(XUL,XML User

Interface Language)。不過,只有前面列表中的語言是 W3C 推薦標(biāo)準(zhǔn)。

4. Web 瀏覽器對(duì) DOM 的支持情況

DOM 標(biāo)準(zhǔn)在 Web 瀏覽器實(shí)現(xiàn)它之前就已經(jīng)作為標(biāo)準(zhǔn)發(fā)布了。IE 在第 5 版中嘗試支持 DOM,但直

到 5.5 版才開始真正支持,該版本實(shí)現(xiàn)了 DOM Level 1 的大部分。IE 在第 6 版和第 7 版中都沒有實(shí)現(xiàn)新

特性,第 8 版中修復(fù)了一些問題。

網(wǎng)景在 Netscape 6(Mozilla 0.6.0)之前都不支持 DOM。Netscape 7 之后,Mozilla 把開發(fā)資源轉(zhuǎn)移到開發(fā) Firefox 瀏覽器上。Firefox 3+支持全部的 Level 1、幾乎全部的 Level 2,以及 Level 3 的某些部分。

(Mozilla 開發(fā)團(tuán)隊(duì)的目標(biāo)是打造百分之百兼容標(biāo)準(zhǔn)的瀏覽器,他們的工作也得到了應(yīng)有的回報(bào)。)

支持 DOM 是瀏覽器廠商的重中之重,每個(gè)版本發(fā)布都會(huì)改進(jìn)支持度。

1.2.3 BOM

IE3 和 Netscape Navigator 3 提供了瀏覽器對(duì)象模型(BOM) API,用于支持訪問和操作瀏覽器的窗

口。使用 BOM,開發(fā)者可以操控瀏覽器顯示頁面之外的部分。而 BOM真正獨(dú)一無二的地方,當(dāng)然也是

問題最多的地方,就是它是唯一一個(gè)沒有相關(guān)標(biāo)準(zhǔn)的 JavaScript 實(shí)現(xiàn)。HTML5 改變了這個(gè)局面,這個(gè)版

本的 HTML 以正式規(guī)范的形式涵蓋了盡可能多的 BOM 特性。由于 HTML5 的出現(xiàn),之前很多與 BOM

有關(guān)的問題都迎刃而解了。

總體來說,BOM 主要針對(duì)瀏覽器窗口和子窗口(frame),不過人們通常會(huì)把任何特定于瀏覽器的

擴(kuò)展都?xì)w在 BOM的范疇內(nèi)。比如,下面就是這樣一些擴(kuò)展:

?? 彈出新瀏覽器窗口的能力;

?? 移動(dòng)、縮放和關(guān)閉瀏覽器窗口的能力;

? navigator 對(duì)象,提供關(guān)于瀏覽器的詳盡信息;

? location 對(duì)象,提供瀏覽器加載頁面的詳盡信息;

? screen 對(duì)象,提供關(guān)于用戶屏幕分辨率的詳盡信息;

? performance 對(duì)象,提供瀏覽器內(nèi)存占用、導(dǎo)航行為和時(shí)間統(tǒng)計(jì)的詳盡信息;

?? 對(duì) cookie 的支持;

?? 其他自定義對(duì)象,如 XMLHttpRequest 和 IE 的 ActiveXObject 。

因?yàn)樵诤荛L(zhǎng)時(shí)間內(nèi)都沒有標(biāo)準(zhǔn),所以每個(gè)瀏覽器實(shí)現(xiàn)的都是自己的 BOM。有一些所謂的事實(shí)標(biāo)準(zhǔn),

比如對(duì)于 window 對(duì)象和 navigator 對(duì)象,每個(gè)瀏覽器都會(huì)給它們定義自己的屬性和方法?,F(xiàn)在有了

HTML5,BOM的實(shí)現(xiàn)細(xì)節(jié)應(yīng)該會(huì)日趨一致。關(guān)于 BOM,本書會(huì)在第 12 章再專門詳細(xì)介紹。

1.3 JavaScript 版本

作為網(wǎng)景的繼承者,Mozilla 是唯一仍在延續(xù)最初 JavaScript 版本編號(hào)的瀏覽器廠商。當(dāng)初網(wǎng)景在將

其源代碼開源時(shí)(項(xiàng)目名為 Mozilla Project),JavaScript 在其瀏覽器中最后的版本是 1.3。(前面提到過,

1.4 版是專門為服務(wù)器實(shí)現(xiàn)的。)因?yàn)?Mozilla Foundation 在持續(xù)開發(fā) JavaScript,為它增加新特性、關(guān)鍵

字和語法,所以 JavaScript 的版本號(hào)也在不斷遞增。下表展示了 Netscape/Mozilla 瀏覽器發(fā)布的歷代

JavaScript 版本。

瀏 覽 器? JavaScript 版本

Netscape Navigator 2? 1.0

Netscape Navigator 3? 1.1

Netscape Navigator 4? 1.2

Netscape Navigator 4.06? 1.3

Netscape 6+(Mozilla 0.6.0+)? 1.5

Firefox 1? 1.5

Firefox 1.5? 1.6

Firefox 2? 1.7

Firefox 3? 1.8

Firefox 3.5? 1.8.1

Firefox 3.6? 1.8.2

Firefox 4? 1.8.5

這種版本編號(hào)方式是根據(jù) Firefox 4 要發(fā)布 JavaScript 2.0 決定的,在此之前版本號(hào)的每次遞增,

反映的是 JavaScript 實(shí)現(xiàn)逐漸接近 2.0 建議。雖然這是最初的計(jì)劃,但 JavaScript 的發(fā)展讓這個(gè)計(jì)劃變

得不可能。JavaScript 2.0 作為一個(gè)目標(biāo)已經(jīng)不存在了,而這種版本號(hào)編排方式在 Firefox 4 發(fā)布后就終

止了。

注意 Netscape/Mozilla仍然沿用這種版本方案。而 IE 的 JScript 有不同的版本號(hào)規(guī)則。這

些 JScript 版本與上表提到的 JavaScript 版本并不對(duì)應(yīng)。此外,多數(shù)瀏覽器對(duì) JavaScript 的

支持,指的是實(shí)現(xiàn) ECMAScript 和 DOM 的程度。

1.4 小結(jié)

JavaScript 是一門用來與網(wǎng)頁交互的腳本語言,包含以下三個(gè)組成部分。

?? ECMAScript:由 ECMA-262 定義并提供核心功能。

?? 文檔對(duì)象模型(DOM):提供與網(wǎng)頁內(nèi)容交互的方法和接口。

?? 瀏覽器對(duì)象模型(BOM):提供與瀏覽器交互的方法和接口。

JavaScript 的這三個(gè)部分得到了五大 Web 瀏覽器(IE、Firefox、Chrome、Safari 和 Opera)不同程度的支持。所有瀏覽器基本上對(duì) ES5(ECMAScript 5)提供了完善的支持,而對(duì) ES6(ECMAScript 6)和ES7(ECMAScript 7)的支持度也在不斷提升。這些瀏覽器對(duì) DOM 的支持各不相同,但對(duì) Level 3 的支持日益趨于規(guī)范。HTML5 中收錄的 BOM 會(huì)因?yàn)g覽器而異,不過開發(fā)者仍然可以假定存在很大一部分公共特性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容