摘要:指的是計(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)用堆棧將為空。之后,步驟如下
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
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
摘要:引言學(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即是異步...
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...
摘要:同時(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 是一門 ...
摘要:同步異步是單線程的,每次只能做一件事情。像以下這種情況,代碼會(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...
閱讀 1470·2021-09-03 10:29
閱讀 3483·2019-08-29 16:24
閱讀 2079·2019-08-29 11:03
閱讀 1447·2019-08-26 13:52
閱讀 2954·2019-08-26 11:36
閱讀 2816·2019-08-23 17:19
閱讀 582·2019-08-23 17:14
閱讀 838·2019-08-23 13:59