成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

javascript的執(zhí)行機制是什么

js是單線程的,為什么可以執(zhí)行異步操作呢?

主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)公司、程序開發(fā)、微網(wǎng)站、微信平臺小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運作于一體,具備承接不同規(guī)模與類型的建設(shè)項目的能力。

這歸結(jié)與瀏覽器(js的宿主環(huán)境)通過某種方式使得js具備了異步的屬性。

區(qū)分進程和線程:

進程:正在運行中的應(yīng)用程序。每個進程都自己獨立的內(nèi)存空間。例如:打開的瀏覽器就是一個進程。

線程:進程的子集,是獨立的。線程在共享的內(nèi)存空間中運行。

瀏覽器是多進程的。如下圖:

javascript的執(zhí)行機制是什么

并且每打開一個頁面就創(chuàng)建了一個獨立的進程。進程內(nèi)有自己的多線程。如果瀏覽器是單進程的,那么某個頁面崩了,就會影響整個瀏覽器。

瀏覽器有哪些進程:

1、Browser(瀏覽器):瀏覽器的主進程(負責(zé)協(xié)調(diào),主控)只有一個,作用有:

? 負責(zé)瀏覽器界面顯示,與用戶交互。如前進,后退等

? 負責(zé)各個頁面的管理,創(chuàng)建和銷毀其他進程

? 將Renderer(渲染器)進程得到的內(nèi)存中的Bitmap,繪制到用戶界面上

? 網(wǎng)絡(luò)資源的管理,下載等

2、第三方插件進程:每種類型的插件對應(yīng)一個進程,僅當(dāng)使用該插件時才創(chuàng)建

3、GPU進程:最多一個,用于3D繪制等

4、瀏覽器渲染進程(瀏覽器內(nèi)核)(Renderer(渲染器),內(nèi)部是多線程的)默認每個Tab頁面一個進程,互不影響。主要作用 :頁面渲染,腳本執(zhí)行,事件處理等

瀏覽器渲染進程(瀏覽器內(nèi)核)包含的線程:

1、GUI渲染線程

? 負責(zé)渲染瀏覽器界面,解析HTML,CSS,構(gòu)建DOM樹和RenderObject樹,布局和繪制等。

? 當(dāng)界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時,該線程就會執(zhí)行

? 注意,GUI渲染線程與JS引擎線程是互斥的,當(dāng)JS引擎執(zhí)行時GUI線程會被掛起(相當(dāng)于被凍結(jié)了),GUI更新會被保存在一個隊列中等到JS引擎空閑時立即被執(zhí)行。

2、JS引擎線程(

“JavaScript 引擎”通常被稱作一種 虛擬機。也稱為JS內(nèi)核,負責(zé)處理Javascript腳本程序。(例如V8引擎)

? JS引擎線程負責(zé)解析Javascript腳本,運行代碼。

? JS引擎一直等待著任務(wù)隊列中任務(wù)的到來,然后加以處理,一個Tab頁(renderer進程)中無論什么時候都只有一個JS線程在運行JS程序

? 同樣注意,GUI渲染線程與JS引擎線程是互斥的,所以如果JS執(zhí)行的時間過長,這樣就會造成頁面的渲染不連貫,導(dǎo)致頁面渲染加載阻塞。

3、事件觸發(fā)線程

? 歸屬于瀏覽器而不是JS引擎,用來控制事件循環(huán)(可以理解,JS引擎自己都忙不過來,需要瀏覽器另開線程協(xié)助)

? 當(dāng)JS引擎執(zhí)行代碼塊如setTimeOut時(也可來自瀏覽器內(nèi)核的其他線程,如鼠標(biāo)點擊、AJAX異步請求等),會將對應(yīng)任務(wù)添加到事件線程中

? 當(dāng)對應(yīng)的事件符合觸發(fā)條件被觸發(fā)時,該線程會把事件添加到待處理隊列的隊尾,等待JS引擎的處理

? 注意,由于JS的單線程關(guān)系,所以這些待處理隊列中的事件都得排隊等待JS引擎處理(當(dāng)JS引擎空閑時才會去執(zhí)行)

4. 定時觸發(fā)器線程

? 傳說中的setInterval與setTimeout所在線程

? 瀏覽器定時計數(shù)器并不是由JavaScript引擎計數(shù)的,(因為JavaScript引擎是單線程的, 如果處于阻塞線程狀態(tài)就會影響記計時的準(zhǔn)確)

? 因此通過單獨線程來計時并觸發(fā)定時(計時完畢后,添加到事件隊列中,等待JS引擎空閑后執(zhí)行)

? 注意,W3C在HTML標(biāo)準(zhǔn)中規(guī)定,規(guī)定要求setTimeout中低于4ms的時間間隔算為4ms。

5、異步http請求線程

? 在XMLHttpRequest在連接后是通過瀏覽器新開一個線程請求

? 將檢測到狀態(tài)變更時,如果設(shè)置有回調(diào)函數(shù),異步線程就產(chǎn)生狀態(tài)變更事件,將這個回調(diào)再放入事件隊列中。再由JavaScript引擎執(zhí)行。

GUI渲染線程與JS引擎線程互斥:

由于JavaScript是可操縱DOM的,如果在修改這些元素屬性同時渲染界面(即JS線程和UI線程同時運行),那么渲染線程前后獲得的元素數(shù)據(jù)就可能不一致了。因此為了防止渲染出現(xiàn)不可預(yù)期的結(jié)果,瀏覽器設(shè)置GUI渲染線程與JS引擎為互斥的關(guān)系,當(dāng)JS引擎執(zhí)行時GUI線程會被掛起,GUI更新則會被保存在一個隊列中等到JS引擎線程空閑時立即被執(zhí)行。

js執(zhí)行機制:js是單線程的,每當(dāng)執(zhí)行函數(shù)就把函數(shù)推入棧中,但有異步的操作就讓瀏覽器的線程(webAPI)去處理,處理完放到任務(wù)隊列里,當(dāng)主線程(執(zhí)行棧)執(zhí)行完畢時,如果任務(wù)隊列里有任務(wù),就執(zhí)行。

javascript的執(zhí)行機制是什么

這也就是為什么下面代碼會先輸出b,然后是a的原因。settimeout的函數(shù)會放到任務(wù)隊列中,而console.log('b')是主線程。

setTimeout(() => {
   console.log('a');
}, 0);
console.log('b');

以上就是淺談javascript執(zhí)行機制的詳細內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!

文章題目:javascript的執(zhí)行機制是什么
文章分享:http://jinyejixie.com/article20/gpidjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司品牌網(wǎng)站設(shè)計、網(wǎng)站改版、移動網(wǎng)站建設(shè)、微信公眾號網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
漠河县| 德江县| 太仆寺旗| 夏津县| 镇沅| 庄河市| 威宁| 文昌市| 靖宇县| 民勤县| 栖霞市| 旬阳县| 昌邑市| 遂溪县| 苏尼特右旗| 缙云县| 镶黄旗| 青阳县| 遂宁市| 志丹县| 阿拉善右旗| 广东省| 扎囊县| 岐山县| 措勤县| 四会市| 南木林县| 健康| 厦门市| 门头沟区| 黄大仙区| 洛南县| 海南省| 阳谷县| 杭锦旗| 阿拉尔市| 蓬安县| 于都县| 无极县| 罗平县| 福建省|