經(jīng)典面試題
37.哪些地方會出現(xiàn)css阻塞,哪些地方會出現(xiàn)js阻塞?
js的阻塞特性
所有瀏覽器在下載JS的時候,會阻止一切其他活動,比如其他資源的下載,內(nèi)容的呈現(xiàn)等等。直到JS下載、解析、執(zhí)行完畢后才開始繼續(xù)并行下載其他資源并呈現(xiàn)內(nèi)容。為了提高用戶體驗(yàn),新一代瀏覽器都支持并行下載JS,但是JS下載仍然會阻塞其它資源的下載(例如圖片,css文件等)。
由于瀏覽器為了防止出現(xiàn)JS修改DOM樹,重新構(gòu)建DOM樹的情況,所以就會阻塞其他的下載和呈現(xiàn)。
嵌入JS會阻塞所有內(nèi)容的呈現(xiàn),而外部JS只會阻塞其后內(nèi)容的顯示,2種方式都會阻塞其后資源的下載。也就是說外部樣式不會阻塞外部腳本的加載,但會阻塞外部腳本的執(zhí)行。CSS阻塞
CSS本來是可以并行下載的,在什么情況下會出現(xiàn)阻塞加載了(在測試觀察中,IE6下CSS都是阻塞加載)。當(dāng)CSS后面跟著嵌入的JS的時候,該CSS就會出現(xiàn)阻塞后面資源下載的情況。而當(dāng)把嵌入JS放到CSS前面,就不會出現(xiàn)阻塞的情況了。
根本原因:因?yàn)闉g覽器會維持html中css和js的順序,樣式表必須在嵌入的JS執(zhí)行前先加載、解析完。而嵌入的JS會阻塞后面的資源加載,所以就會出現(xiàn)上面CSS阻塞下載的情況。-
嵌入JS應(yīng)該放在什么位置?
- 放在底部,雖然放在底部照樣會阻塞所有呈現(xiàn),但不會阻塞資源下載
- 如果嵌入JS放在head中,請把嵌入JS放在CSS頭部。
- 使用defer(只支持IE)
- 不要在嵌入的JS中調(diào)用運(yùn)行時間較長的函數(shù),如果一定要用,可以用
setTimeout來調(diào)用
-
Javascript無阻塞加載具體方式
-
將腳本放在底部。
<link>還是放在head中,用以保證在js加載前,能加載出正常顯示的頁面。<script>標(biāo)簽放在</body>前。 -
成組腳本。由于每個
<script>標(biāo)簽下載時阻塞頁面解析過程,所以限制頁面的<script>總數(shù)也可以改善性能。適用于內(nèi)聯(lián)腳本和外部腳本。 -
非阻塞腳本。等頁面完成加載后,再加載js代碼。也就是,在window.onload事件發(fā)出后開始下載代碼。
- defer屬性。支持IE4和fierfox3.5更高版本瀏覽器
- 動態(tài)腳本元素。文檔對象模型(DOM)允許使用js動態(tài)創(chuàng)建HTML的幾乎全部文檔內(nèi)容。代碼如下:
-
將腳本放在底部。
<script>
var script=document.createElement("script");
script.type="text/javascript";
script.src="file.js";
document.getElementsByTagName("head")[0].appendChild(script);
</script>
此技術(shù)的重點(diǎn)在于:無論在何處啟動下載,文件額下載和運(yùn)行都不會阻塞其他頁面處理過程。即使在head里(除了用于下載文件的http鏈接)。
38.CSS選擇符有哪些?哪些屬性可以繼承?優(yōu)先級算法如何計(jì)算?內(nèi)聯(lián)和important哪個優(yōu)先級高?
-
選擇符
- id選擇器( # myid)
- 類選擇器(.myclassname)
- 標(biāo)簽選擇器(div, h1, p)
- 相鄰選擇器(h1 + p)
- 子選擇器(ul > li)
- 后代選擇器(li a)
- 通配符選擇器( * )
- 屬性選擇器(a[rel = "external"])
- 偽類選擇器(a: hover, li: nth - child)
可繼承的樣式:
font-size,font-family,color,ul,li,dd,dt;不可繼承的樣式:
borderpaddingmarginwidthheight;-
優(yōu)先級
- 就近原則 :外部樣式 < 內(nèi)部樣式 < 內(nèi)聯(lián)樣式
- 選擇器優(yōu)先權(quán):內(nèi)聯(lián)樣式(權(quán)重1000)> ID選擇器(權(quán)重100) > class選擇器(權(quán)重10)> html標(biāo)簽
-
!important最大
39.在JavaScript我們會遇到閉包,請你們根據(jù)自己的理解分析一下什么是閉包?閉包有什么好處?使用閉包要注意什么?
傳送門:https://segmentfault.com/a/1190000000652891
40.如何阻止事件冒泡和默認(rèn)事件(程序)
// 阻止事件冒泡
stopPropagation: function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
} else {
ev.cancelBubble = true;
}
},
// 取消事件的默認(rèn)行為
preventDefault: function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
兩道思考題~
19.談?wù)劺厥諜C(jī)制方式及內(nèi)存管理.
內(nèi)存泄漏指任何對象在您不再擁有或需要它之后仍然存在。
垃圾回收器定期掃描對象,并計(jì)算引用了每個對象的其他對象的數(shù)量。如果一個對象的引用數(shù)量為 0(沒有其他對象引用過該對象),或?qū)υ搶ο蟮奈┮灰檬茄h(huán)的,那么該對象的內(nèi)存即可回收。
setTimeout 的第一個參數(shù)使用字符串而非函數(shù)的話,會引發(fā)內(nèi)存泄漏。
閉包、控制臺日志、循環(huán)(在兩個對象彼此引用且彼此保留時,就會產(chǎn)生一個循環(huán))
20.開發(fā)過程中遇到的內(nèi)存泄露情況,如何解決的?
之前自己總結(jié)的內(nèi)存泄漏筆記:http://blog.csdn.net/az_77/article/details/74930137