您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了JavaScript運行機制是什么,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
首先,JavaScript是按照順序,一行一行執(zhí)行的,且JS只有一條線程,即不可能進行兩條代碼同時執(zhí)行,也就是說,在一條代碼執(zhí)行時,它后面的所有代碼都需要等待,直到該代碼執(zhí)行結束,后面的才能繼續(xù)執(zhí)行。如果是這樣,就會導致用戶體驗度極其不好,例如一個請求發(fā)送給服務器,后續(xù)代碼就會一直等待,直到服務器返回結果,用戶才能進行新的操作。
這又是怎么回事呢?
JavaScript是以壓棧的方式進行代碼的執(zhí)行的,一開始執(zhí)行時棧內為空,當執(zhí)行開始,JS引擎會將代碼放入棧底,若該代碼包含其他函數(shù)的調用,則將被調用的函數(shù)放在棧頂,若該代碼未包含其他函數(shù)的調用,則執(zhí)行該函數(shù),執(zhí)行完成后出棧,以此類推,最終直到棧為空。
事實上,真正的JS內部分為同步任務和異步任務,然而這并沒有改變JS單線程的特征。
系統(tǒng)來說,JS存在一個主線程,它會首先執(zhí)行所有同步任務,而異步任務都會先進行注冊,然后主線程不會等待異步任務執(zhí)行結果的返回,而是繼續(xù)執(zhí)行下面的同步任務(在此過程中,如果異步任務返回結果,接下來的回調函數(shù)會放在Event Queue中等待),直到同步任務全部執(zhí)行完畢,主線程就會從Event Queue讀取任務進行執(zhí)行。該過程會不斷循環(huán),即事件循環(huán)Event Loop。
不覺得奇怪嗎,如果按照上述同步任務和異步任務的執(zhí)行方式,那不是一輪就可以執(zhí)行完畢嗎,又何來的Event Loop?
這是個小細節(jié),異步任務存在多個時,每一個異步任務返回的結果所需的時間都是不同的,這就存在Event Queue以先進先出的形式將返回結果進行排隊,第一個異步任務返回結果,那么就將其放在隊列的首位,接下來的異步任務緊隨其后,就這樣排成一隊。當主線程空閑時(即同步任務執(zhí)行完畢后),便從Event Queue中讀取事件,放入主線程執(zhí)行。而循環(huán)來自于,當Event Queue執(zhí)行完畢后,過了一段時間,又有之前的異步任務返回結果,放到Event Queue中,監(jiān)控器檢測到Event Queue為非空,主線程又開始執(zhí)行Event Queue中的任務。
在解釋定義之前,我們先對異步任務進行說明:
廣義上JS分為同步任務和異步任務,在此對任務進行更精細的定義:
在此,之所以提出宏任務和微任務,是為了更好的理解事件循環(huán)!
執(zhí)行過程:
簡而言之,就是先執(zhí)行宏任務,再執(zhí)行微任務,特別注意兩點即可:
這里看個例子:
console.log('1'); setTimeout(function() { console.log('2'); process.nextTick(function() { console.log('3'); }) new Promise(function(resolve) { console.log('4'); resolve(); }).then(function() { console.log('5') }) }) process.nextTick(function() { console.log('6'); }) new Promise(function(resolve) { console.log('7'); resolve(); }).then(function() { console.log('8') }) setTimeout(function() { console.log('9'); process.nextTick(function() { console.log('10'); }) new Promise(function(resolve) { console.log('11'); resolve(); }).then(function() { console.log('12') }) }) //作者:ssssyoki //鏈接:https://juejin.im/post/59e85eebf265da430d571f89 //來源:掘金
輸出順序為:
1,7,6,8,2,4,3,5,9,11,10,12
以上就是關于JavaScript運行機制是什么的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。