JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記 概述
在JavaScript面世之初,沒有人會(huì)想到它會(huì)被應(yīng)用的如此廣泛,也遠(yuǎn)比一般人想象中的要復(fù)雜強(qiáng)大的多,在我自己學(xué)習(xí)的過程中,曾經(jīng)有過多次震撼,只是常常沒有過多久,很多美輪美奐的用法就又模糊起來,希望通過對(duì)JavaScript高級(jí)程序設(shè)計(jì)(第3版)的專題學(xué)習(xí)筆記,能夠較為系統(tǒng)的將基礎(chǔ)知識(shí)梳理一次,也能夠?qū)⒆约浩匠W(xué)習(xí)與工作過程中遇到的一些美妙用法記錄下來,便于自己再次學(xué)習(xí),當(dāng)然,也希望可以給有需要的朋友們一些力所能及的幫助。
相關(guān)術(shù)語(yǔ)
先簡(jiǎn)要說一下和JavaScript相關(guān)的一些背景術(shù)語(yǔ),就不詳細(xì)討論JavaScript的歷史了,想了解的朋友可以參考原書。
- ECMAScript:由ECMA制定,在ECMA-262中定義的腳本語(yǔ)言標(biāo)準(zhǔn)。ECMAScript只是一個(gè)腳本語(yǔ)言標(biāo)準(zhǔn),你盡可以在自己的環(huán)境中取實(shí)現(xiàn)它,這個(gè)環(huán)境,就稱為ECMAScript的宿主環(huán)境,Web瀏覽器可以說是ECMAScript目前最重要的宿主環(huán)境了,而不同的Web瀏覽器,對(duì)ECMAScript標(biāo)準(zhǔn)的支持也不盡相同。除Web瀏覽器,Adobe ActionScript也實(shí)現(xiàn)了ECMAScript。一般的宿主環(huán)境,除了實(shí)現(xiàn)ECMAScript標(biāo)準(zhǔn),也會(huì)有各自的擴(kuò)展,以便與環(huán)境更好的交互。
- ES3、ES5:ECMAScript目前最新的版本是5.1版,發(fā)布于2011年7月,可以從其官方網(wǎng)站免費(fèi)下載。最主要的兩個(gè)版本是第3版和第5版,分別簡(jiǎn)稱為ES3和ES5,目前五大瀏覽器(IE、Firefox、Chrome、Safari、Opera)都已經(jīng)開始不同程度的支持ES5了,但目前在Web瀏覽器上兼容性最好的還是第3版。介于向后兼容和安全上的考慮,第5版提供了普通和嚴(yán)格兩種模式,后面會(huì)再討論相關(guān)內(nèi)容。
- LiveScript、JavaScript、JScript:LiveScript是Netscape最初開發(fā)JavaScript時(shí)的名稱,在發(fā)布時(shí),為了趕上Java的時(shí)髦,臨時(shí)修改為JavaScript了,而JScript則是微軟為了防止版權(quán)沖突而給自己的腳本語(yǔ)言起的名稱。對(duì)于開發(fā)者來說,他們都只是ECMAScript的實(shí)現(xiàn)。一般來說,JavaScript的除了實(shí)現(xiàn)ECMAScript外,還會(huì)包括針對(duì)瀏覽器的擴(kuò)展(BOM:瀏覽器對(duì)象模型)和針對(duì)XML/HTML API的擴(kuò)展(DOM:文檔對(duì)象模型)。
- BOM:瀏覽器對(duì)象模型(Browser Object Model)。
使用JavaScript
在HTML中使用JavaScript的方式主要有:
- 使用<script>標(biāo)簽元素引入外部文件(推薦),將代碼寫入外部文件中。
- 使用<script>標(biāo)簽元素嵌入JavaScript代碼。
- 直接在HTML中嵌入JavaScript代碼,比如在HTML元素中的事件處理程序。
<script>標(biāo)簽元素:
屬性 | 是否必填 | 適用范圍 | 說明 |
async | 可選 | 外部文件 | 表示應(yīng)該立即下載腳本,但不應(yīng)妨礙頁(yè)面中的其它操作,比如下載資源或其它腳本文件 |
charset | 可選 | 外部文件 | 表示通過src指定的代碼的字符集 |
defer | 可選 | 外部文件,IE4-7也支持嵌入代碼 | 表示腳本可以延遲到文檔完全解析和顯示之后再執(zhí)行 |
language | 可選(已廢棄) | 原用于表示編寫代碼的腳本語(yǔ)言 | |
src | 可選,使用外部文件時(shí)為必填選項(xiàng) | 外部文件 | 表示包含要執(zhí)行的外部文件 |
type | 可選,默認(rèn)text/javascript | 可以看成是language的替代屬性,表示編寫代碼使用的腳本語(yǔ)言的內(nèi)容類型(也稱為MIME類型)。 |
說明:
(1)外部文件
A、在XHTML文檔中,導(dǎo)入外部文件時(shí),可以使用簡(jiǎn)寫方式<script/>但是在HTML中只能<script></script>。
B、導(dǎo)入外部文件時(shí),src屬性是必須的,這個(gè)時(shí)候嵌入在<script></script>中的代碼(如果有)會(huì)被忽略。
C、src屬性也可以指定來自外部域的JavaScript文件,這一點(diǎn)讓<script>元素異常強(qiáng)大,也備受爭(zhēng)議,因?yàn)榭赡軙?huì)讓人惡意注入腳本。
D、外部文件只需要包含<script></script>中的代碼即可,不需要包括<script>元素本身;外部文件一般擴(kuò)展名為.js,但這不是強(qiáng)制的。
(2)在<script>元素中內(nèi)嵌代碼時(shí),只需要指定type屬性,但代碼中不能出現(xiàn)</script>字符串,否則會(huì)解析出錯(cuò)。例如:
<script type="text/javascript">
//document.writeln('</script>');會(huì)將字符串中的</script>作為前面的標(biāo)簽結(jié)束符來解析,從而出現(xiàn)異常
document.writeln('</scr'+'ipt>');//通過將</script>分開,從而避免作為<script>的結(jié)束標(biāo)簽解析
</script>
(3)關(guān)于type屬性,雖然text/javascript和java/ecmascript都已經(jīng)不被推薦使用,但一直以來使用的都還是test/javascript,實(shí)際上,服務(wù)器在傳送JavaScript文件時(shí)使用的MIME類型通常是application/x-javascript,但在type中設(shè)置這個(gè)值可能導(dǎo)致腳本被忽略,另外,在非IE瀏覽器中還可以使用application/javascript和application/ecmascript。type如果沒有指定,默認(rèn)值為text/javascript。
?。?)只要不包含async和defer,瀏覽器會(huì)按照<script>在頁(yè)面中出現(xiàn)的順序依次解析;設(shè)置了defer時(shí),會(huì)立即下載<script>元素,但是延遲執(zhí)行,在規(guī)范中,要求多個(gè)含defer屬性的腳本順序執(zhí)行且在DOMContentLoaded事件前執(zhí)行,但是在實(shí)現(xiàn)中不一定滿足這些要求;在HTML5中添加了async屬性,和defer類似,也只是適用于外部文件,告訴瀏覽器立即下載文件,但延遲執(zhí)行,不同的是,多個(gè)含async的腳本即便在規(guī)范中也沒有規(guī)定執(zhí)行的順序,異步腳本再load事件前執(zhí)行,但可能在DOMContentLoaded之前或之后執(zhí)行。
?。?)在閱讀之前的代碼或者用一些IDE生成代碼時(shí),常??梢钥吹较旅娴慕Y(jié)構(gòu):
<script type="text/javascript">
//<![CDATA[
// 這里首先是以//開始的JavaScript注釋
// 然后<![CDATA[...]]>結(jié)構(gòu)是XHTML(XML)的一個(gè)特殊區(qū)域,區(qū)域內(nèi)的文本不需要做任何解析,以防止XHTML將代碼中的類似小于號(hào)“<”的這種特殊符號(hào)解析為元素標(biāo)簽
// 若不使用CDATA結(jié)構(gòu),則需要轉(zhuǎn)義成相應(yīng)實(shí)體,比如小于號(hào)(<)需要使用(<)
// 對(duì)于不兼容XHTML的,由于最開始的//注釋,也能夠平穩(wěn)退化
//]]>
</script>
一些常用的HTML轉(zhuǎn)義:
顯示 | 說明 | 實(shí)體名稱 | 實(shí)體編號(hào) |
半方大的空白 |   |   | |
全方大的空白 |   |   | |
不斷行的空白 | |   | |
< | 小于 | < | < |
> | 大于 | > | > |
& | &符號(hào) | & | & |
" | 雙引號(hào) | " | " |
有些不支持JavaScript的瀏覽器,可以將JavaScript代碼包含在一個(gè)HTML注釋中(由于所有主流瀏覽器均支持JavaScript,所以不再推薦使用):
<script><!--
//--></script>
對(duì)于一些老舊瀏覽器或者禁用了JavaScript的瀏覽器,還可以使用<noscript></noscript>元素來呈現(xiàn)相關(guān)的說明。
文檔模式
在IE5.5中開始引入文檔模式的概念,通過使用通過文檔類型(doctype)切換實(shí)現(xiàn)的,最初包括混雜模式(quirks mode)和標(biāo)準(zhǔn)模式(standards mode),混雜模式讓IE的行為與包括非標(biāo)準(zhǔn)特性的IE5相同,標(biāo)準(zhǔn)模式則讓IE的行為更接近標(biāo)準(zhǔn)行為。在IE引入文檔模式之后,其他瀏覽器也紛紛仿效。之后,IE又提出一種所謂準(zhǔn)標(biāo)準(zhǔn)模式(almost standards mode),這種模式下的瀏覽器特性有很多是符合標(biāo)準(zhǔn)的,但也不盡然。所有瀏覽器默認(rèn)開啟混雜模式。
可以通過下面的方法啟動(dòng)標(biāo)準(zhǔn)模式:
<!-- HTML 4.01 嚴(yán)格型-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!-- XHTML 1.0 嚴(yán)格型-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- HTML5 -->
<!DOCTYPE html>
通過過渡性或框架集型來觸發(fā)準(zhǔn)標(biāo)準(zhǔn)模式:
<!-- HTML 4.01 過渡型-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- HTML 4.01 框架集型-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 FrameSet//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<!-- XHTML 1.0 過渡型-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- XHTML 1.0 框架集型-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 FrameSet//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
相關(guān)文章
JavaScript String 對(duì)象常用方法詳解
下面小編就為大家?guī)硪黄狫avaScript String 對(duì)象常用方法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05詳談DOM簡(jiǎn)介及節(jié)點(diǎn)、屬性、查找節(jié)點(diǎn)的方法
下面小編就為大家分享一篇詳談DOM簡(jiǎn)介及節(jié)點(diǎn)、屬性、查找節(jié)點(diǎn)的方法,具有非常好的參考價(jià)值,一起跟隨小編過來看看吧,希望對(duì)大家有所幫助2017-11-11JavaScript中用getDate()方法返回指定日期的教程
這篇文章主要介紹了JavaScript中用getDate()方法返回指定日期的教程,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06網(wǎng)頁(yè)編輯器ckeditor和ckfinder配置步驟分享
ckeditor+ckfinder配置用法,現(xiàn)在ckeditor是互聯(lián)網(wǎng)上應(yīng)用比較廣泛的網(wǎng)頁(yè)編輯器了,這里介紹下配置方法,需要的朋友可以參考下2012-05-05詳解JavaScript中基于原型prototype的繼承特性
這篇文章主要介紹了詳解JavaScript中基于原型prototype的繼承特性,JavaScript中缺少類等面向?qū)ο蟮闹匾匦?因而談到繼承也顯得十分古怪...需要的朋友可以參考下2016-05-05Mobile Web開發(fā)基礎(chǔ)之四--處理手機(jī)設(shè)備的橫豎屏問題
這篇文章主要介紹了Mobile Web開發(fā)基礎(chǔ)之-—處理手機(jī)設(shè)備的橫豎屏,window.orientation屬性與onorientationchange事件以及media query方式是開發(fā)過程中需要注意到的兩種解決方式,需要的朋友可以參考下2017-08-08JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記10 再訪js對(duì)象
在ECMAScript中,兩個(gè)核心主題就是對(duì)象與函數(shù),而這兩個(gè)主題也有些互相纏繞的,在前面幾個(gè)博文中大略的過了一遍函數(shù)相關(guān)的基礎(chǔ)知識(shí),這篇文章再回到對(duì)象主題上來2012-10-10深入學(xué)習(xí)JavaScript中的原型prototype
這篇文章主要介紹了深入學(xué)習(xí)JavaScript中的原型prototype,是JavaScript入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08JS排序方法(sort,bubble,select,insert)代碼匯總
新技術(shù)一直在不斷變化,掌握一些基礎(chǔ)是未來學(xué)習(xí)不斷更新的技術(shù)的堅(jiān)實(shí)基礎(chǔ)。近來閑來無事,為了溫習(xí)一下從前學(xué)的數(shù)據(jù)結(jié)構(gòu),將數(shù)據(jù)結(jié)構(gòu)中的排序算法用JS實(shí)現(xiàn)了一遍,2016-01-01