欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

游覽器中javascript的執(zhí)行過程(圖文)

 更新時(shí)間:2012年05月20日 20:00:26   作者:  
在講這個(gè)問題之前,先來補(bǔ)充幾個(gè)知識(shí)點(diǎn),如果對(duì)此已經(jīng)比較了解可以直接跳過
1. 大多數(shù)游覽器的組件構(gòu)成如圖     


在最底層的三個(gè)組件分別是網(wǎng)絡(luò),UI后端和js解釋器。作用如下:
(1)網(wǎng)絡(luò)- 用來完成網(wǎng)絡(luò)調(diào)用,例如http請(qǐng)求,它具有平臺(tái)無關(guān)的接口,可以在不同平臺(tái)上工作
(2)UI 后端- 用來繪制類似組合選擇框及對(duì)話框等基本組件,具有不特定于某個(gè)平臺(tái)的通用接口,底層使用操作系統(tǒng)的用戶接口
(3)JS解釋器- 用來解釋執(zhí)行JS代碼

ps:上圖和知識(shí)點(diǎn)主要來自《HOW BROWSERS WORK: BEHIND THE SCENES OF MODERN WEB BROWSERS》 想深入了解的同學(xué)可以重點(diǎn)看下。
2. 大多數(shù)游覽器(比如chrome)讓一個(gè)單線程共用于執(zhí)行javascrip和更新用戶界面。這個(gè)線程通常被稱為“游覽器UI線程”, 每個(gè)時(shí)刻只能執(zhí)行其中一種操作,這意味著當(dāng)Javascript代碼正在執(zhí)行時(shí)用戶界面無法響應(yīng)輸入,反之亦然。這樣做是因?yàn)閖avascript代碼的作用就是操作DOM更新用戶界面,用同一個(gè)線程來做負(fù)責(zé)這兩件事情可以更高效
3. 游覽器UI線程的工作基于一個(gè)簡(jiǎn)單的隊(duì)列系統(tǒng),任務(wù)會(huì)被保存到隊(duì)列中直到進(jìn)程空閑。一旦空閑,隊(duì)列中的下一個(gè)任務(wù)就被重新提取出來并運(yùn)行。這些任務(wù)要么是運(yùn)行javascript代碼,要么執(zhí)行UI更新,包括重繪和重排。
4. 重點(diǎn)再強(qiáng)調(diào)下,javascript是單線程運(yùn)行,千萬別被setTimeout()和setInterVal()這種函數(shù)迷惑而誤以為它是多線程。
ok,基礎(chǔ)點(diǎn)講解完畢,讓我們進(jìn)入正題,來講解在游覽器中javascript的執(zhí)行過程。
一、原理
一般而言,<script>標(biāo)簽每次出現(xiàn)都會(huì)霸道地讓頁面等待腳本的解析和執(zhí)行,無論當(dāng)前的Javascript是內(nèi)嵌的還是包含了外鏈文件,頁面的下載和渲染都必須停下來等待腳本執(zhí)行完成。這在頁面的生存周期中是必要的,因?yàn)槟_本執(zhí)行過程中可能修改頁面內(nèi)容,一個(gè)典型的例子就是在頁面中使用document.write()。
當(dāng)javascript代碼是內(nèi)嵌在html里面時(shí),這點(diǎn)還是比較容易理解,但當(dāng)javascript是外鏈文件時(shí)稍微有點(diǎn)負(fù)載,因?yàn)榇嬖谝粋€(gè)加載過程,而且游覽器加載好這個(gè)js文件之后往往還對(duì)其緩存。
首先,我們用以下這個(gè)例子來說明下緩存問題
復(fù)制代碼 代碼如下:

<html>
<head>
<script type='text/javascript' src='js/f2.js'></script>
</head>
<body>
</body>
</html>

第一次打開頁面時(shí):

    第二次打開頁面時(shí):

    從上例中可以明顯看出,像chrome之類的高版本游覽器會(huì)對(duì)js文件進(jìn)行緩存,作用是不言而喻,減少網(wǎng)絡(luò)請(qǐng)求。

其次,第二個(gè)問題,當(dāng)一個(gè)javascript文件被加載時(shí)是否會(huì)阻塞其他javascript文件或者其他文件的加載?!陡咝阅躂avascript》一書中對(duì)這個(gè)問題做了較好的解答:各種游覽器的低版本的處理是當(dāng)一個(gè)javascript文件在加載時(shí),會(huì)同時(shí)阻塞頁面其他文件的加載(包括其他javascript文件),但I(xiàn)E8,F(xiàn)irfox3.5,Safari 4和Chrome 2都允許并行下載javascript文件,但遺憾的是,javascript下載過程仍然會(huì)組舍其他資源的下載,比如圖片。盡管javascript腳本的下載過程不會(huì)相互影響,但頁面仍然必須等待所有的javascript代碼下載并執(zhí)行完成才能繼續(xù)。

這里說句題外話:游覽器對(duì)同一域名下的并發(fā)鏈接數(shù)也是有限制的,其他一些參數(shù)如下:

二、技巧
1. 腳本位置
由于腳本會(huì)阻塞頁面其他資源的下載,因此推薦將所有的<script>標(biāo)簽放到<body>標(biāo)簽的底部,已盡量減少對(duì)整個(gè)頁面下載的影響。
2. 將能合并的js文件合并
3. 無阻塞腳本
現(xiàn)在比較常用的方法就是動(dòng)態(tài)加載執(zhí)行腳本。你的原理是通過DOM,你幾乎可以用Javascript動(dòng)態(tài)創(chuàng)建HTML中的所有內(nèi)容,其根本在于,<script>標(biāo)簽與頁面中其他元素并無差異:都能通過DOM引用,都能在文檔中移動(dòng),刪除和創(chuàng)建。文件在改該<script>元素被添加到頁面時(shí)開始現(xiàn)在,它不會(huì)阻止其他文件下載,只在執(zhí)行階段阻塞渲染。特別強(qiáng)調(diào):《高性能javascript》一文中說“這種技術(shù)的重點(diǎn)在于:無論何時(shí)啟動(dòng)下載,文件的下載和執(zhí)行都不會(huì)阻塞頁面其他進(jìn)程”,這并不是說它在執(zhí)行不會(huì)阻塞其他javascript代碼,而是要強(qiáng)調(diào)不會(huì)阻塞其他資源的下載等其他任務(wù)。
具體的代碼如下:

復(fù)制代碼 代碼如下:

function loadScript(url){
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = url;
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
}

4. 神奇的setTimeout()
這里我不過多的將setTimeout()的原理,有興趣的讀者可以具體去看《高性能javascript》的第六章。我重點(diǎn)強(qiáng)調(diào)下,setTimeout的第二個(gè)參數(shù)并不是一個(gè)精確的時(shí)間,二是必須在javascript線程空閑時(shí)才能運(yùn)行。利用這個(gè)特性,如下代碼簡(jiǎn)單可以實(shí)現(xiàn)等待其他js代碼執(zhí)行完畢后再執(zhí)行function里面的代碼。
復(fù)制代碼 代碼如下:

setTimeout(function(){
// do some before other javascripe codes had processed
}, 25)

但在function里面不要使用document.write()方法,因?yàn)閳?zhí)行setTimeout里面函數(shù)時(shí)往往已經(jīng)到了頁面onload之后,此時(shí)再執(zhí)行 document.write 將導(dǎo)致當(dāng)前頁面的內(nèi)容被清空,因?yàn)樗鼤?huì)自動(dòng)觸發(fā) document.open 方法。
《高性能Javascript》
HOW BROWSERS WORK: BEHIND THE SCENES OF MODERN WEB BROWSERS
Google Chrome源碼剖析【一】:多線程模型
javascript異步加載詳解

相關(guān)文章

  • 解決layer彈出層的內(nèi)容頁點(diǎn)擊按鈕跳轉(zhuǎn)到新的頁面問題

    解決layer彈出層的內(nèi)容頁點(diǎn)擊按鈕跳轉(zhuǎn)到新的頁面問題

    今天小編就為大家分享一篇解決layer彈出層的內(nèi)容頁點(diǎn)擊按鈕跳轉(zhuǎn)到新的頁面問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JS快速實(shí)現(xiàn)移動(dòng)端拼圖游戲

    JS快速實(shí)現(xiàn)移動(dòng)端拼圖游戲

    最近開發(fā)一個(gè)有關(guān)手機(jī)端拼圖游戲,是基于js實(shí)現(xiàn)的。今天小編抽時(shí)間把具體實(shí)現(xiàn)代碼分享到腳本之家平臺(tái)供大家參考,對(duì)js移動(dòng)端拼圖游戲感興趣的朋友參考下吧
    2016-09-09
  • 關(guān)于Iframe父頁面與子頁面之間的相互調(diào)用

    關(guān)于Iframe父頁面與子頁面之間的相互調(diào)用

    下面小編就為大家?guī)硪黄P(guān)于Iframe父頁面與子頁面之間的相互調(diào)用。小編覺得挺不錯(cuò)的,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-11-11
  • echarts 3D地圖為區(qū)域自定義顏色的解決方法

    echarts 3D地圖為區(qū)域自定義顏色的解決方法

    在Echarts中,我們很多時(shí)候是需要給自己想要的幾個(gè)區(qū)域的地圖進(jìn)行顏色高亮,這篇文章主要給大家介紹了關(guān)于echarts 3D地圖為區(qū)域自定義顏色的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 使用JavaScript為一張圖片設(shè)置備選路徑的方法

    使用JavaScript為一張圖片設(shè)置備選路徑的方法

    在做網(wǎng)頁開發(fā)的時(shí)候,有時(shí)候希望給圖片設(shè)置一個(gè)備選路徑,即,當(dāng)src屬性對(duì)應(yīng)的主路徑加載失敗的時(shí)候,圖片可以馬上切換到備選路徑,怎么實(shí)現(xiàn)呢?下面通過本文給大家分享JavaScript為一張圖片設(shè)置備選路徑的方法,一起看看吧
    2017-01-01
  • ES6 javascript中class類的get與set用法實(shí)例分析

    ES6 javascript中class類的get與set用法實(shí)例分析

    這篇文章主要介紹了ES6 javascript中class類的get與set用法,結(jié)合具體實(shí)例形式分析了ES6中類的get與set關(guān)鍵字使用方法,需要的朋友可以參考下
    2017-10-10
  • 使用JavaScript獲取URL中的參數(shù)(兩種方法)

    使用JavaScript獲取URL中的參數(shù)(兩種方法)

    這篇文章主要介紹了使用JavaScript獲取URL中的參數(shù)(兩種方法)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • uniapp實(shí)現(xiàn)地圖點(diǎn)聚合功能的詳細(xì)教程

    uniapp實(shí)現(xiàn)地圖點(diǎn)聚合功能的詳細(xì)教程

    最近公司項(xiàng)目需求需要對(duì)設(shè)備在地圖上面進(jìn)行監(jiān)控,并在當(dāng)設(shè)備一定距離時(shí)進(jìn)行聚合,這篇文章主要給大家介紹了關(guān)于uniapp實(shí)現(xiàn)地圖點(diǎn)聚合功能的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 使用element-plus時(shí)重寫樣式不起作用的問題及解決方法

    使用element-plus時(shí)重寫樣式不起作用的問題及解決方法

    這篇文章給大家介紹使用element-plus時(shí)重寫樣式不起作用的問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-09-09
  • 微信小程序列表中item左滑刪除功能

    微信小程序列表中item左滑刪除功能

    這篇文章主要介紹了微信小程序列表中item左滑刪除功能,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11

最新評(píng)論