成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

初識JavaScript EventLoop

ZHAO_ / 1058人閱讀

摘要:指的是計(jì)算機(jī)系統(tǒng)的一種運(yùn)行機(jī)制。環(huán)境中的執(zhí)行順序是隨機(jī)的這一次,徹底弄懂執(zhí)行機(jī)制的規(guī)范和實(shí)現(xiàn)

Event Loop指的是計(jì)算機(jī)系統(tǒng)的一種運(yùn)行機(jī)制。JavaScript采用此機(jī)制解決單線程引發(fā)相關(guān)問題

在瀏覽器中的web應(yīng)用會(huì)涉及到.JavaScript引擎、WebAPI、Event Loop、Task Queue (Macro Task, Micro Task).因此如果想弄清Event Queue.我們必須都以上都有所了解.

JavaScript引擎:

目前市面上解析JavaScript文件效率最高的就是Google的V8引擎.它主要由兩個(gè)部分組成:

內(nèi)存堆: 負(fù)責(zé)內(nèi)存分配發(fā)生的地方.

調(diào)用堆棧: 代碼執(zhí)行時(shí)堆棧幀的位置.(是一種數(shù)據(jù)結(jié)構(gòu),記錄了程序的基本位置.先進(jìn)后出)

function multiply(x, y) {
    return x * y;
}
function printSquare(x) {
    var s = multiply(x, x);
    console.log(s);
}
printSquare(5);

當(dāng)引擎開始執(zhí)行此代碼時(shí),調(diào)用堆棧將為空。之后,步驟如下

并發(fā)和事件循環(huán)

JavaScript是一門單線程語言.因此只有一個(gè)單一的調(diào)用堆棧,并且一次只能做一件事,當(dāng)我們進(jìn)行一些復(fù)雜的耗時(shí)操作(圖形轉(zhuǎn)換)時(shí).瀏覽器就無法進(jìn)行其他事情,無法渲染任何內(nèi)容.也不能運(yùn)行其它代碼.

為了解決瀏覽器被阻塞的問題,JavaScript提供了一種解決方案異步回調(diào)函數(shù)(asynchronous callback functions).異步函數(shù)在解析過程中不會(huì)被立即執(zhí)行,會(huì)被瀏覽器放入Task Queue

Task Queue 分為 Macrotask, Microtask

Event Loop 每執(zhí)行一次 先從Macrotask隊(duì)列中拉出一個(gè).然后檢查microtask隊(duì)列是否為空.依次執(zhí)行直至清空隊(duì)列.

Macrotask主要包含:setTimeout、setInterval、setImmediate、I/O、UI交互事件

microtask主要包含:Promise、process.nextTick、MutaionObserver

process.nextTick 永遠(yuǎn)大于 promise.then.

Node中,_tickCallback在每一次執(zhí)行完TaskQueue中的一個(gè)任務(wù)后被調(diào)用,而這個(gè)_tickCallback中實(shí)質(zhì)上干了兩件事:

nextTickQueue中所有任務(wù)執(zhí)行掉(長度最大1e4,Node版本v6.9.1)

第一步執(zhí)行完后執(zhí)行_runMicrotasks函數(shù),執(zhí)行microtask中的部分(promise.then注冊的回調(diào))

自測
console.log("1");

process.nextTick(function() {
    console.log("4");
});

setTimeout(function() {
    console.log("6");
    process.nextTick(function() {
        console.log("7");
    });
}, 0);

new Promise(function(resolve, reject) {
    console.log("2");
    resolve();
}).then(function() {
    console.log("5");
});

console.log("3");

setImmediate和setTimeout的延遲設(shè)為0,或1的時(shí)候,他們的執(zhí)行順序是隨機(jī)的。

setTimeout(() => {
    console.log(2)
}, 2)

setTimeout(() => {
    console.log(1)
}, 1)

setTimeout(() => {
    console.log(0)
}, 0)
// 谷歌瀏覽器環(huán)境中的執(zhí)行順序是1 0 2。
// Node環(huán)境中的執(zhí)行順序是隨機(jī)的

What is the JavaScript event loop?

How JavaScript works: an overview of the engine, the runtime, and the call stack

這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制

Event Loop的規(guī)范和實(shí)現(xiàn)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92623.html

相關(guān)文章

  • JS核心知識點(diǎn)梳理——異步,單線程,運(yùn)行機(jī)制

    摘要:引言學(xué)習(xí)的時(shí)候,經(jīng)常聽人說,即是異步的,又是單線程的。所以我們說是異步單線程的。參考從瀏覽器多進(jìn)程到單線程,運(yùn)行機(jī)制最全面的一次梳理運(yùn)行機(jī)制詳解再談異步機(jī)制詳解運(yùn)行原理解析并發(fā)模型與事件循環(huán) showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 學(xué)習(xí)javascipt的時(shí)候,經(jīng)常聽人說,javascipt即是異步...

    TANKING 評論0 收藏0
  • js運(yùn)行機(jī)制-事件循環(huán)EventLoop

    js運(yùn)行機(jī)制-事件循環(huán)EventLoop 先來看看一段js代碼: console.log(script begin) setTimeout(() => { console.log(setTimeout) },0) new Promise((resolve) => { console.log(promise begin) for(let i = 0; i < 1000; i...

    jayce 評論0 收藏0
  • 淺析 JS 中的 EventLoop 事件循環(huán)(新手向)

    摘要:同時(shí),如果執(zhí)行的過程中發(fā)現(xiàn)其他函數(shù),繼續(xù)入棧然后執(zhí)行。上面我們討論的其實(shí)都是同步代碼,代碼在運(yùn)行的時(shí)候只用調(diào)用棧解釋就可以了。 序 Event Loop 這個(gè)概念相信大家或多或少都了解過,但是有一次被一個(gè)小伙伴問到它具體的原理的時(shí)候,感覺自己只知道個(gè)大概印象,于是計(jì)劃著寫一篇文章,用輸出倒逼輸入,讓自己重新學(xué)習(xí)這個(gè)概念,同時(shí)也能幫助更多的人理解它~ 概念 JavaScript 是一門 ...

    chadLi 評論0 收藏0
  • JavaScript同步、異步及事件循環(huán)

    摘要:同步異步是單線程的,每次只能做一件事情。像以下這種情況,代碼會(huì)按順序執(zhí)行,這個(gè)就叫同步。雖然是單線程,但是瀏覽器是多線程的,在遇到像事件等這種任務(wù)時(shí),會(huì)轉(zhuǎn)交給瀏覽器的其他工作線程上面提到的幾個(gè)線程執(zhí)行,執(zhí)行完之后將回調(diào)函數(shù)放入到任務(wù)隊(duì)列。 同步、異步 JS是單線程的,每次只能做一件事情。像以下這種情況,代碼會(huì)按順序執(zhí)行,這個(gè)就叫同步。 console.log(1); console.l...

    zr_hebo 評論0 收藏0

發(fā)表評論

0條評論

ZHAO_

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<