setTimeout或者DOM,HTTP請求這些東西並不存在於V8引擎中 那咱們如何進行異步編程呢?javascript
什麼是調用棧java
cal stack是記錄當前程序所在位置的數據結構編程
你能夠藉助以下動圖理解call stack瀏覽器
當咱們在Chrome的控制檯上運行以下代碼時,會拋出一個異常,它將整個棧樹都打印了出來數據結構
錯誤是從foo開始,到bar,到baz,再到匿名函數,也就是上圖中的main函數異步
若是咱們有一個調用自身的函數foo,那麼會發生什麼呢?編程語言
沒有什麼嚴格意義上的阻塞,阻塞僅僅指的是代碼運行很慢,好比說異步編程
反正在調用棧裏表現很慢的東西都叫阻塞函數
javascript程序中任務能夠分爲兩類oop
同步任務會依次進入call stack調用棧中執
異步任務會被v8引擎聽任務隊列中,只有當同步任務所有執行完畢,異步任務纔會從隊列首部至尾部依次進入調用棧執行
V8引擎提供了兩個東西
- 1 主線程會去執行全部的同步任務。
- 2 等到同步任務所有執行完,就會去看任務隊列裏面的異步任務。
- 3 若是知足條件,那麼異步任務就從新進入主線程開始執行,這時它就變成同步任務了。
- 4 等到執行完,下一個異步任務再進入主線程開始執行。一旦任務隊列清空,程序就結束執行
經過下面動圖加深理解
異步任務的寫法一般是回調函。一旦異步任務從新進入主線程,就會執行對應的回調函數。若是一個異步任務沒有回調函數,就不會進入任務隊列,也就是說,不會從新進入主線程,由於沒有用回調函數指定下一步的操做。
javaScript 引擎怎麼知道異步任務有沒有結果,能不能進入主線程呢?答案就是v8引擎在不停地檢查,一遍又一遍,只要同步任務執行完了,引擎就會去檢查那些掛起來的異步任務,是否是能夠進入主線程了。這種循環檢查的機制,就叫作事件循環(Event Loop)
V8引擎主要作了哪些事情