JavaScript的發(fā)展歷史
JavaScript因?yàn)榛ヂ?lián)網(wǎng)而生,緊隨著瀏覽器的出現(xiàn)而問世意敛。
1994年12月吗货,Navigator瀏覽器發(fā)布了1.0版,市場(chǎng)份額一舉超過90%京郑。Netscape公司很快發(fā)現(xiàn),Navigator瀏覽器需要一種可以嵌入網(wǎng)頁(yè)的腳本語(yǔ)言葫掉,用來(lái)控制瀏覽器行為些举。管理層對(duì)這種瀏覽器腳本語(yǔ)言的設(shè)想是:功能不需要太強(qiáng),語(yǔ)法較為簡(jiǎn)單俭厚,容易學(xué)習(xí)和部署户魏。那一年,正逢Sun公司的Java語(yǔ)言問世挪挤,市場(chǎng)推廣活動(dòng)非常成功叼丑。Netscape公司決定與Sun公司合作,瀏覽器支持嵌入Java小程序(后來(lái)稱為Java applet)扛门。
1995年鸠信,Netscape公司雇傭了程序員Brendan Eich開發(fā)這種網(wǎng)頁(yè)腳本語(yǔ)言。Brendan Eich有很強(qiáng)的函數(shù)式編程背景尖飞,希望以Scheme語(yǔ)言(函數(shù)式語(yǔ)言鼻祖LISP語(yǔ)言的一種方言)為藍(lán)本症副,實(shí)現(xiàn)這種新語(yǔ)言。1995年5月政基,Brendan Eich只用了10天贞铣,就設(shè)計(jì)完成了這種語(yǔ)言的第一版。
Netscape公司的這種瀏覽器腳本語(yǔ)言沮明,最初名字叫做Mocha辕坝,1995年9月改為L(zhǎng)iveScript。12月荐健,Netscape公司與Sun公司(Java語(yǔ)言的發(fā)明者和所有者)達(dá)成協(xié)議酱畅,后者允許將這種語(yǔ)言叫做JavaScript。這樣一來(lái)江场,Netscape公司可以借助Java語(yǔ)言的聲勢(shì)纺酸,而Sun公司則將自己的影響力擴(kuò)展到了瀏覽器。
1995年12月4日址否,Netscape公司與Sun公司聯(lián)合發(fā)布了JavaScript語(yǔ)言餐蔬。
1996年3月,Navigator 2.0瀏覽器正式內(nèi)置了JavaScript腳本語(yǔ)言佑附。
1996年11月樊诺,Netscape公司決定將JavaScript提交給國(guó)際標(biāo)準(zhǔn)化組織ECMA(European Computer Manufacturers Association),希望JavaScript能夠成為國(guó)際標(biāo)準(zhǔn)音同,以此抵抗微軟词爬。
1997年7月,ECMA組織發(fā)布262號(hào)標(biāo)準(zhǔn)文件(ECMA-262)的第一版权均,規(guī)定了瀏覽器腳本語(yǔ)言的標(biāo)準(zhǔn)顿膨,并將這種語(yǔ)言稱為ECMAScript。這個(gè)版本就是ECMAScript 1.0版叽赊。 ECMAScript和JavaScript的關(guān)系是虽惭,前者是后者的規(guī)格,后者是前者的一種實(shí)現(xiàn)蛇尚。
1997年7月芽唇,ECMAScript 1.0發(fā)布。
1998年6月取劫,ECMAScript 2.0版發(fā)布匆笤。
1999年12月,ECMAScript 3.0版發(fā)布谱邪,成為JavaScript的通行標(biāo)準(zhǔn)炮捧,得到了廣泛支持。
2007年10月惦银,ECMAScript 4.0版草案發(fā)布咆课,對(duì)3.0版做了大幅升級(jí)末誓,預(yù)計(jì)次年8月發(fā)布正式版本。
2009年12月书蚪,ECMAScript 5.0版正式發(fā)布喇澡。
2011年6月,ECMAscript 5.1版發(fā)布殊校,并且成為ISO國(guó)際標(biāo)準(zhǔn)(ISO/IEC 16262:2011)晴玖。
2015年6月,ECMAScript 6正式發(fā)布为流,并且更名為“ECMAScript 2015”呕屎。
TIPS: JavaScript與Java的關(guān)系
JavaScript和Java是兩種不一樣的語(yǔ)言,但是它們之間存在聯(lián)系敬察。
JavaScript的基本語(yǔ)法和對(duì)象體系秀睛,是模仿Java而設(shè)計(jì)的。但是莲祸,JavaScript沒有采用Java的靜態(tài)類型琅催。正是因?yàn)镴avaScript與Java有很大的相似性,所以這門語(yǔ)言才從一開始的LiveScript改名為JavaScript虫给√俾眨基本上,JavaScript這個(gè)名字的原意是“很像Java的腳本語(yǔ)言”抹估。
在JavaScript語(yǔ)言中缠黍,函數(shù)是一種獨(dú)立的數(shù)據(jù)類型,以及采用基于原型對(duì)象(prototype)的繼承鏈药蜻。這是它與Java語(yǔ)法最大的兩點(diǎn)區(qū)別瓷式。JavaScript語(yǔ)法要比Java自由得多。
另外语泽,Java語(yǔ)言需要編譯贸典,而JavaScript語(yǔ)言則是運(yùn)行時(shí)由解釋器直接執(zhí)行。
總之踱卵,JavaScript的原始設(shè)計(jì)目標(biāo)是一種小型的廊驼、簡(jiǎn)單的動(dòng)態(tài)語(yǔ)言莲趣,與Java有足夠的相似性聂渊,使得使用者(尤其是Java程序員)可以快速上手。
瀏覽器的渲染機(jī)制
- 解析HTML仇让,構(gòu)建DOM樹
- 解析CSS西饵,構(gòu)建CSSOM
- 將DOM與CSSOM組成渲染樹
- 根據(jù)渲染樹計(jì)算頁(yè)面布局及節(jié)點(diǎn)的幾何結(jié)構(gòu)
- 把所有節(jié)點(diǎn)繪制在屏幕上
樣式酝掩、JS 在 HTML 中如何放置?
樣式置于HTML<head>里面用link
引入
JS置于<body>標(biāo)簽內(nèi),放在所有HTML元素之后(因?yàn)槟_本會(huì)阻塞后面內(nèi)容的呈現(xiàn)和阻塞其后組件的下載)
解釋白屏和 FOUC
白屏和FOUC(Flash of Unstyled Content 無(wú)樣式內(nèi)容閃爍)的出現(xiàn)是由于不同瀏覽器對(duì)HTML和CSS處理不同造成的眷柔,部分瀏覽器先將HTML和CSS加載完畢期虾,再對(duì)頁(yè)面進(jìn)行渲染原朝,而在瀏覽器加載HTML和CSS的時(shí)間內(nèi)并沒有內(nèi)容顯示,這就造成了白屏問題镶苞;FOUC(無(wú)樣式內(nèi)容閃爍)喳坠,是由于部分瀏覽器先對(duì)HTML展示,等待CSS加載完成之后在對(duì)樣式進(jìn)行修改宾尚,因此導(dǎo)致FOUC。
介紹下 repaint和 reflow的概念(可選)
reflow:瀏覽器根據(jù)各種樣式(瀏覽器默認(rèn)谢澈、開發(fā)人員定義等)計(jì)算各個(gè)元素的盒模型所應(yīng)在的位置煌贴,并根據(jù)計(jì)算結(jié)果將元素置于其應(yīng)在的位置的過程;
repaint:各元素的屬性全部確定下來(lái)之后锥忿,瀏覽器按照這些元素的特性將其繪制出來(lái)的過程牛郑。
如何異步加載腳本
使用defer或async
使用 async使加載和渲染后續(xù)文檔元素的過程將和js腳本的加載與執(zhí)行并行進(jìn)行;
使用defer使加載后續(xù)文檔元素的過程將和js腳本的加載并行進(jìn)行敬鬓,但js腳本的執(zhí)行要在所有元素解析完成之后淹朋,DOMContentLoaded 事件觸發(fā)之前完成。