Lesson One — JavaScript

一晶框、什么是JavaScript


JavaScript 是一種具有面向?qū)ο竽芰Φ呐盘А⒔忉屝偷某绦蛟O(shè)計語言。更具體一點授段,它是基于對象和事件驅(qū)動并具有相對安全性的客戶端腳本語言 蹲蒲。因為他不需要在一個語言環(huán)境下運行,而只需要支持它的瀏覽器即可侵贵。它的主要目的是届搁,驗證發(fā)往服務(wù)器端的數(shù)據(jù)、增加 Web 互動窍育、加強用戶體驗度等卡睦。

二、JavaScript的特點


松散性

JavaScript 語言核心與 C漱抓、C++表锻、Java 相似,比如條件判斷辽旋、循環(huán)浩嫌、運算符等檐迟。但补胚,它 卻是一種松散類型的語言,也就是說追迟,它的變量不必具有一個明確的類型溶其。

對象屬性

JavaScript 中的對象把屬性名映射為任意的屬性值。它的這種方式很像哈希表或關(guān)聯(lián)數(shù) 組敦间,而不像 C 中的結(jié)構(gòu)體或者 C++瓶逃、Java 中的對象。

繼承機制

JavaScript 中的面向?qū)ο罄^承機制是基于原型的廓块,這和另外一種不太為人所知的 Self 語 言很像厢绝,而和 C++以及 Java 中的繼承大不相同。

三带猴、JavaScript 歷史


  • 1994年10月昔汉,NCSA的一個主要程序員Marc Andreessen聯(lián)合風(fēng)險投資家Jim Clark,成立了Mosaic通信公司(Mosaic Communications)拴清,不久后改名為Netscape靶病。這家公司的方向会通,就是在Mosaic的基礎(chǔ)上,開發(fā)面向普通用戶的新一代的瀏覽器Netscape Navigator娄周。

  • 1994年12月涕侈,Navigator發(fā)布了1.0版,市場份額一舉超過90%煤辨。
    Netscape公司很快發(fā)現(xiàn)裳涛,Navigator瀏覽器需要一種可以嵌入網(wǎng)頁的腳本語言,用來控制瀏覽器行為掷酗。當(dāng)時调违,網(wǎng)速很慢而且上網(wǎng)費很貴,有些操作不宜在服務(wù)器端完成泻轰。比如技肩,如果用戶忘記填寫“用戶名”,就點了“發(fā)送”按鈕浮声,到服務(wù)器再發(fā)現(xiàn)這一點就有點太晚了虚婿,最好能在用戶發(fā)出數(shù)據(jù)之前,就告訴用戶“請?zhí)顚懹脩裘庇净印_@就需要在網(wǎng)頁中嵌入小程序然痊,讓瀏覽器檢查每一欄是否都填寫了。
    管理層對這種瀏覽器腳本語言的設(shè)想是:功能不需要太強屉符,語法較為簡單剧浸,容易學(xué)習(xí)和部署。那一年矗钟,正逢Sun公司的Java語言問世唆香,市場推廣活動非常成功。Netscape公司決定與Sun公司合作吨艇,瀏覽器支持嵌入Java小程序(后來稱為Java applet)躬它。但是,瀏覽器腳本語言是否就選用Java东涡,則存在爭論冯吓。后來,還是決定不使用Java疮跑,因為網(wǎng)頁小程序不需要Java這么“重”的語法组贺。但是,同時也決定腳本語言的語法要接近Java祖娘,并且可以支持Java程序失尖。這些設(shè)想直接排除了使用現(xiàn)存語言,比如Perl、Python和TCL雹仿。

  • 1995年增热,Netscape公司雇傭了程序員Brendan Eich開發(fā)這種網(wǎng)頁腳本語言。Brendan Eich有很強的函數(shù)式編程背景胧辽,希望以Scheme語言(函數(shù)式語言鼻祖LISP語言的一種方言)為藍(lán)本峻仇,實現(xiàn)這種新語言。

  • 1995年5月邑商,Brendan Eich只用了10天摄咆,就設(shè)計完成了這種語言的第一版。它是一個大雜燴人断,語法有多個來源:

基本語法:借鑒C語言和Java語言吭从。
數(shù)據(jù)結(jié)構(gòu):借鑒Java語言,包括將值分成原始值和對象兩大類恶迈。
函數(shù)的用法:借鑒Scheme語言和Awk語言涩金,將函數(shù)當(dāng)作第一等公民,并引入閉包暇仲。
原型繼承模型:借鑒Self語言(Smalltalk的一種變種)步做。
正則表達(dá)式:借鑒Perl語言。
字符串和數(shù)組處理:借鑒Python語言奈附。

為了保持簡單全度,這種腳本語言缺少一些關(guān)鍵的功能,比如塊級作用域斥滤、模塊将鸵、子類型(subtyping)等等,但是可以利用現(xiàn)有功能找出解決辦法佑颇。這種功能的不足顶掉,直接導(dǎo)致了后來JavaScript的一個顯著特點:對于其他語言,你需要學(xué)習(xí)語言的各種功能漩符,而對于JavaScript一喘,你常常需要學(xué)習(xí)各種解決問題的模式驱还。而且由于來源多樣嗜暴,從一開始就注定,JavaScript的編程風(fēng)格是函數(shù)式編程和面向?qū)ο缶幊痰囊环N混合體议蟆。

Netscape公司的這種瀏覽器腳本語言闷沥,最初名字叫做Mocha,1995年9月改為LiveScript咐容。12月舆逃,Netscape公司與Sun公司(Java語言的發(fā)明者和所有者)達(dá)成協(xié)議,后者允許將這種語言叫做JavaScript。這樣一來路狮,Netscape公司可以借助Java語言的聲勢虫啥,而Sun公司則將自己的影響力擴展到了瀏覽器。

之所以起這個名字奄妨,并不是因為JavaScript本身與Java語言有多么深的關(guān)系(事實上涂籽,兩者關(guān)系并不深),而是因為Netscape公司已經(jīng)決定砸抛,使用Java語言開發(fā)網(wǎng)絡(luò)應(yīng)用程序评雌,JavaScript可以像膠水一樣,將各個部分連接起來直焙。當(dāng)然景东,后來的歷史是Java語言的瀏覽器插件失敗了,JavaScript反而發(fā)揚光大奔誓。

  • 1995年12月4日斤吐,Netscape公司與Sun公司聯(lián)合發(fā)布了JavaScript語言。

  • 1996年3月厨喂,Navigator 2.0瀏覽器正式內(nèi)置了JavaScript腳本語言曲初。

四、ECMAScript的誕生


  • 1996年11月杯聚,JavaScript的創(chuàng)造者Netscape公司臼婆,決定將JavaScript提交給國際標(biāo)準(zhǔn)化組織ECMA,希望這種語言能夠成為國際標(biāo)準(zhǔn)幌绍。ECMA是European Computer Manufacturers Association的縮寫颁褂,即歐洲計算機制造商協(xié)會,ECMA是制定信息傳輸與通訊的國際化標(biāo)準(zhǔn)組織傀广。 ECMA的第39號技術(shù)專家委員會(Technical Committee 39颁独,簡稱TC39)負(fù)責(zé)制訂ECMAScript標(biāo)準(zhǔn),成員包括Netscape伪冰、Sun誓酒、Microsoft、Mozilla贮聂、Google等大公司靠柑。
  • 1997年,ECMA發(fā)布262號標(biāo)準(zhǔn)文件(ECMA-262)的第一版吓懈,規(guī)定了瀏覽器腳本語言的標(biāo)準(zhǔn)歼冰,并將這種語言稱為ECMAScript,這個版本就是1.0版耻警。 該標(biāo)準(zhǔn)從一開始就是針對JavaScript語言制定的隔嫡,但是之所以不叫JavaScript甸怕,有兩個原因。一是商標(biāo)腮恩,Java是Sun公司的商標(biāo)梢杭,根據(jù)授權(quán)協(xié)議,只有Netscape公司可以合法地使用JavaScript這個名字秸滴,且JavaScript本身也已經(jīng)被Netscape公司注冊為商標(biāo)式曲。二是想體現(xiàn)這門語言的制定者是ECMA,不是Netscape缸榛,這樣有利于保證這門語言的開放性和中立性吝羞。
    因此,ECMAScript和JavaScript的關(guān)系是内颗,前者是后者的規(guī)格钧排,后者是前者的一種實現(xiàn)。Jscript和ActionScript也算是ECMAScript的一種實現(xiàn)均澳。

五恨溜、ECMAScript的發(fā)展


  • 1997年,ECMAScript 1.0發(fā)布找前。

  • 1998年糟袁,ECMAScript 2.0發(fā)布

  • 1999年,ECMAScript 3.0發(fā)布躺盛。3.0版是一個巨大的成功项戴,在業(yè)界得到廣泛支持,成為通行標(biāo)準(zhǔn)槽惫,奠定了JavaScript語言的基本語法周叮,以后的版本完全繼承。直到今天界斜,初學(xué)者一開始學(xué)習(xí)JavaScript仿耽,其實就是在學(xué)3.0版的語法。

  • 2000年各薇,ECMAScript 4.0開始醞釀项贺。這個版本最后沒有通過。為什么ES4沒有通過呢峭判?因為這個版本太激進(jìn)了开缎,對ES3做了徹底升級,導(dǎo)致標(biāo)準(zhǔn)委員會的一些成員不愿意接受朝抖。

  • 2007年啥箭,ECMAScript 4.0版草案發(fā)布谍珊,本來預(yù)計次年8月發(fā)布正式版本治宣。但是急侥,各方對于是否通過這個標(biāo)準(zhǔn),發(fā)生了嚴(yán)重分歧侮邀。以Yahoo坏怪、Microsoft、Google為首的大公司绊茧,反對JavaScript的大幅升級铝宵,主張小幅改動;以JavaScript創(chuàng)造者Brendan Eich為首的Mozilla公司华畏,則堅持當(dāng)前的草案鹏秋。

  • 2008年,由于對于4.0版本應(yīng)該包括哪些功能亡笑,各方分歧太大侣夷,爭論過于激烈,ECMA開會決定仑乌,中止ECMAScript 4.0的開發(fā)百拓,將其中涉及現(xiàn)有功能改善的一小部分,發(fā)布為ECMAScript 3.1(會后不久晰甚,ECMAScript 3.1就改名為ECMAScript 5)衙传,而將其他激進(jìn)的設(shè)想擴大范圍,放入以后的版本厕九。由于會議的氣氛蓖捶,4.0版本的項目代號起名為Harmony(和諧)。

  • 2009年扁远,ECMAScript 5.0版正式發(fā)布腺阳。Harmony項目則一分為二,一些較為可行的設(shè)想定名為JavaScript.next繼續(xù)開發(fā)穿香,后來演變成ECMAScript 6亭引;一些不是很成熟的設(shè)想,則被視為JavaScript.next.next皮获,在更遠(yuǎn)的將來再考慮推出焙蚓。

  • 2011年,ECMAscript 5.1版發(fā)布洒宝,并且成為ISO國際標(biāo)準(zhǔn)购公。

  • 2013年3月,ECMAScript 6草案凍結(jié)雁歌,不再添加新功能宏浩。

  • 2013年12月,ECMAScript 6草案發(fā)布靠瞎。

  • 2015年6月比庄,ECMAScript 6正式通過求妹,成為國際標(biāo)準(zhǔn)。從2000年算起佳窑,這時已經(jīng)過去了15年制恍。

  • ECMAScript 6 提出了很多新的特性,重點加強了模塊神凑、類聲明净神、詞法塊定界、迭代器和生成器溉委、異步編程的回調(diào)鹃唯、模式解析以及合適的尾調(diào)用,另外還擴展了ECMAScript的內(nèi)置庫以支持更多的抽象數(shù)據(jù)結(jié)構(gòu)瓣喊。其目的就是使JavaScript可以用來編寫復(fù)雜的應(yīng)用程序俯渤,成為企業(yè)級開發(fā)語言。

六型宝、JavaScript 核心


1.核心(ECMAScript)
2.文檔對象模型 (DOM)
3.瀏覽器對象模型 (BOM)


七八匠、瀏覽器渲染機制


主要流程 .png

1、解析 HTML 標(biāo)簽, 構(gòu)建 DOM 樹
2趴酣、解析 CSS 標(biāo)簽, 構(gòu)建 CSSOM 樹
3梨树、把 DOM 和 CSSOM 組合成 渲染樹 (render tree)
4、在渲染樹的基礎(chǔ)上進(jìn)行布局, 計算每個節(jié)點的幾何結(jié)構(gòu)
5岖寞、把每個節(jié)點繪制到屏幕上 (painting)

一抡四、DOM解析

解析由兩部分組成:標(biāo)記化和樹構(gòu)建


DOM.png
  • 標(biāo)記化是詞法分析過程,將輸入內(nèi)容解析成多個標(biāo)記仗谆。HTML 標(biāo)記包括起始標(biāo)記指巡、結(jié)束標(biāo)記、屬性名稱和屬性值隶垮。

  • 標(biāo)記生成器識別標(biāo)記藻雪,傳遞給樹構(gòu)造器,然后接受下一個字符以識別下一個標(biāo)記狸吞;如此反復(fù)直到輸入的結(jié)束勉耀。

     <html>
     <head>
         <title>Web page parsing</title>
     </head>
     <body>
         <div>
             <h1>Web page parsing</h1>
             <p>This is an example Web page.</p>
         </div>
     </body>
     </html>
    

DOM Tree解析如下:


html.png

二、css解析

css.png

八蹋偏、JavaScript在 HTML 中如何放置


一便斥、把JavaScript文件放在head中

<head>
<script type="text/javascript" src="style.js"></script>
</head>

JavaScript文件外部加載的好處

1.避免使用<! -- ... // -->,駭客技術(shù)威始。
2.避免使用CDATA枢纠。
3.統(tǒng)一定義JavaScript代碼,方便查看黎棠,方便維護(hù)晋渺。
4.使代碼更安全镰绎,可以壓縮,加密單個JavaScript文件些举。
5.瀏覽器可以緩存JavaScript文件跟狱,減少寬帶使用(當(dāng)多個頁面同時使用一個JavaScript文件的時候俭厚,通常只需下載一次)户魏。

二、把JavaScript文件放在body前

為防止網(wǎng)頁加載緩慢挪挤,也可以把非關(guān)鍵的JavaScript放到網(wǎng)頁底部叼丑,例如下面的代碼:

   <script type="text/javascript" src="style.js"></script>
</body>
</html>

九、白屏和 FOUC


首先
  • 在寫HTML代碼時扛门,我們都是將CSS文件的引入位置放在頭部(<head>標(biāo)簽內(nèi)部)鸠信,將js文件的引入位置放在底部(</body>前面).
白屏:
  • 當(dāng)css文件引入位置放置頭部時,Chrome(谷歌瀏覽器)會先把css文件全部加載完成论寨,再對HTML進(jìn)行渲染星立、展示。
  • 如果把js文件放在頭部葬凳,腳本會阻塞后面內(nèi)容的呈現(xiàn)(如:文字)绰垂,腳本會阻塞其后組件的下載(如:圖片),出現(xiàn)白屏問題火焰。
FOUC(無樣式內(nèi)容閃爍):
  • 當(dāng)css文件引入位置放置頭部時劲装,F(xiàn)irefox(火狐瀏覽器)先展示出HTML中的內(nèi)容,等待css加載完成再對HTML進(jìn)行渲染昌简。

十占业、異步加載腳本


1、async : 腳本延遲到文檔解析和顯示后執(zhí)行纯赎,有順序

<script async src="script.js"></script>

有 async谦疾,加載和渲染后續(xù)文檔元素的過程將和 script.js 的加載與執(zhí)行并行進(jìn)行(異步)。

2犬金、defer:不保證順序

 <script defer src="script.js"></script>

有 defer餐蔬,加載后續(xù)文檔元素的過程將和 script.js 的加載并行進(jìn)行(異步),但 script.js 的執(zhí)行要在所有元素解析完成之后佑附,DOMContentLoaded 事件觸發(fā)之前完成樊诺。


  • 注:自由轉(zhuǎn)載-非商用-非衍生-保持署名

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市音同,隨后出現(xiàn)的幾起案子词爬,更是在濱河造成了極大的恐慌,老刑警劉巖权均,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顿膨,死亡現(xiàn)場離奇詭異锅锨,居然都是意外死亡,警方通過查閱死者的電腦和手機恋沃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門必搞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人囊咏,你說我怎么就攤上這事恕洲。” “怎么了梅割?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵霜第,是天一觀的道長。 經(jīng)常有香客問我户辞,道長泌类,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任底燎,我火速辦了婚禮刃榨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘双仍。我一直安慰自己枢希,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布殊校。 她就那樣靜靜地躺著晴玖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪为流。 梳的紋絲不亂的頭發(fā)上呕屎,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音敬察,去河邊找鬼秀睛。 笑死,一個胖子當(dāng)著我的面吹牛莲祸,可吹牛的內(nèi)容都是我干的蹂安。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锐帜,長吁一口氣:“原來是場噩夢啊……” “哼田盈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缴阎,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤允瞧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體述暂,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡痹升,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了畦韭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼蛾。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖艺配,靈堂內(nèi)的尸體忽然破棺而出察郁,到底是詐尸還是另有隱情,我是刑警寧澤妒挎,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布绳锅,位于F島的核電站西饵,受9級特大地震影響酝掩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眷柔,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一期虾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驯嘱,春花似錦镶苞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剃幌,卻和暖如春聋涨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背负乡。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工牍白, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抖棘。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓茂腥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親切省。 傳聞我的和親對象是個殘疾皇子最岗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • title: JavaScript的歷史layout: pagecategory: introductiondat...
    ichengzi閱讀 4,452評論 0 23
  • 一、什么是JavaScript朝捆? JavaScript 是一種輕量級的腳本語言般渡。所謂“腳本語言”,指的是它不具備開...
    壽木閱讀 4,311評論 0 1
  • JavaScript的發(fā)展歷史 JavaScript因為互聯(lián)網(wǎng)而生,緊隨著瀏覽器的出現(xiàn)而問世诊杆〖呔瑁回顧它的歷史,就要從...
    zh_yang閱讀 367評論 0 0
  • 第二天繼續(xù)行程晨汹,行至半途遇到七輛越野車豹储,我不知前面發(fā)生了什么情況,減慢速度行到跟前淘这,20幾人拿相機對著一群牦牛在拍...
    野在外閱讀 311評論 1 1
  • 我是個三流網(wǎng)紅剥扣, 只為你一個人直播, 只有你一個粉絲铝穷。 我甘于做這樣一個沒有名氣钠怯, 只有你の網(wǎng)紅。
    湛兮閱讀 126評論 0 0