js的Event Loop機制剖析

概述

近來看了一些異步的文章,有一些作者沒有寫代碼也把毛病的明白放上來。想一想,我也應當總結一些,之前口試也有過一道問題,雖然說是考核異步,但實在就是考核異步當中的使命行列。給你一道問題,你認為會順次輸出什麼?

console.log('1')

Promise.resolve().then(() => console.log('2'))

setTimeout(() => {console.log('3'); Promise.resolve().then(() => console.log('4'))}, 0)

Promise.resolve().then(() => console.log('5'))

setTimeout(() => console.log('6'), 0)

console.log('7')

答案是

1 7 2 5 3 4 6

假如你曉得為何會輸出這些的話,那我想你沒必要看下面了,由於你也有也許的明白,假如沒有的話,我就跟你剖析一下吧。

先看一張圖吧,是拿他人的,有部份緣由也是由於他寫的文章有毛病,我才總結。

《js的Event Loop機制剖析》

先明白這張圖片吧,我簡樸引見一下。

  • 棧:主線程的函數實行,異步操縱的實行放在了異步處置懲罰模塊。
  • 堆:用來存儲援用範例的指向。
  • 異步處置懲罰模塊:主線程內里的異步模塊。
  • 使命行列:存儲異步線程的實行行列。

然後,js運轉就是運轉主線程->運轉使命行列

固然,這隻是也許的引見,真正的堆和棧並非和他說的一樣,棧內里另有內存棧和挪用棧,內存棧又有全局的內存棧,也有某個函數的內存棧,固然,函數內部的內存棧又放在了堆內里。這內里的棧,僅僅是代表了挪用棧。

宏使命行列(macrotasks)

什麼是宏使命行列?

宏使命行列macrotasks: setTimeout, setInterval, setImmediate, I/O, UI rendering

上面的基礎操縱就是宏使命行列

微使命行列(microtasks)

微使命行列microtasks: process.nextTick, Promise, MutationObserver

上面的基礎操縱就是微使命行列

Event Loop

我就簡樸的說一下js內里實行遞次吧:

  1. 實行主線程,假如有異步操縱,則放到異步行列實行。實行2
  2. 當主線程實行終了,推斷異步行列是不是有微使命,假如有,則增加進去主線程實行;假如沒有則將最新能夠實行的宏使命加進主線程。返回1

是不是是很簡樸?
那末上面那道題的效果不過就是

// 一開始,主線程
console.log('1');
console.log('7');

// 下一步,主線程
Promise.resolve().then(() => console.log('2'))

// 下一步,主線程
Promise.resolve().then(() => console.log('5'))

// 下一步,主線程
setTimeout(() => {console.log('3')}, 0)

// 下一步,主線程
Promise.resolve().then(() => console.log('4'))

// 下一步,主線程
setTimeout(() => console.log('6'), 0)

總結

看了一下許多文章,認為很難,很想繪圖,但是在寫的過程當中,發明實在真的很簡樸,只需好好相識js內里的引擎就好了,js照樣一個很壯大的單線程言語。

    原文作者:廣工小成
    原文地址: https://segmentfault.com/a/1190000014501666
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞