1. 程式人生 > 其它 >求逆元的四大基本方法

求逆元的四大基本方法

什麼是事件迴圈

JS的程式碼執行是基於一種事件迴圈的機制,之所以稱作事件迴圈,MDN給出的解釋為因為它經常被用於類似如下的方式來實現


while (queue.waitForMessage()) {
  queue.processNextMessage();
}

JS的執行環境主要有兩個:瀏覽器、Node。

在兩個環境下的Event Loop實現是不一樣的,在瀏覽器中基於規範來實現,不同瀏覽器可能有小小區別。在Node中基於libuv這個庫來實現

JS是單執行緒執行的,而基於事件迴圈模型,形成了基本沒有阻塞(除了alert或同步XHR等操作)的狀態

非同步 & 同步

什麼是同步?

“同步”就是後一個任務等待前一個任務結束後再去執行。

什麼是非同步?

“非同步”與同步不同,每一個非同步任務都有一個或多個回撥函式。webapi 會在其相應的時機裡將回調函式新增進入訊息佇列中,不直接執行,然後再去執行後面的任務。直至當前同步任務執行完畢後,再把訊息佇列中的訊息新增進入執行棧進行執行。

Macrotask 與 Microtask

  • 根據 規範,每個執行緒都有一個事件迴圈(Event Loop),在瀏覽器中除了主要的頁面執行執行緒 外,Web worker是在一個新的執行緒中執行的,所以可以將其獨立看待。
  • 每個事件迴圈有至少一個任務佇列(Task Queue,也可以稱作Macrotask巨集任務),各個任務佇列中放置著不同來源(或者不同分類)的任務,可以讓瀏覽器根據自己的實現來進行優先順序排序以及一個微任務佇列(Microtask Queue),主要用於處理一些狀態的改變,UI渲染工作之前的一些必要操作(可以防止多次無意義的UI渲染)
  • 巨集任務與微任務佇列裡的任務隨著:任務進棧、出棧、任務出隊、進隊之間交替著進行
  • 從macrotask佇列中取出一個任務處理,處理完成之後(此時執行棧應該是空的),從microtask佇列中一個個按順序取出所有任務進行處理,處理完成之後進入UI渲染後續工作
  • microtask並不是在macrotask完成之後才會觸發,在回撥函式之後,只要執行棧是空的,就會執行microtask。也就是說,macrotask執行期間,執行棧可能是空的(比如在冒泡事件的處理時)

巨集任務

  • run