函數調用棧、任務隊列、事件輪詢

來源:互聯網
上載者:User

標籤:www   details   https   進入   技術   .com   基礎上   out   同步   

最近接觸nodeJs中,瞭解到了這三個概念。這三個概念在14年,阮一峰老師寫了一篇部落格,撲靈大神在此基礎上完善了,、

對於小菜鳥,簡直是神仙對話,不懂,不明白。

阮一峰: http://www.ruanyifeng.com/blog/2014/10/event-loop.html

撲靈:40143961。

後續看到一篇文章,個人覺得寫的比較好 https://www.cnblogs.com/liangyin/p/9783342.html

 

函數調用棧:(call stack)

  index.js

  

特點: 執行前入棧,執行後出棧。a先執行完 a先出棧,後續就是B出棧,接著就是整個全域上下文出棧,成為空白棧。

 

任務隊列:(task queue)

隊列特點: 先進先出。 

在單線程的js中,任務分為同步任務和非同步任務。

同步任務:在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務。

非同步任務:不進入主線程、由其他線程執行,將回呼函數放入到任務隊列中或者叫事件隊列中,執行完畢後,觸發回呼函數,回呼函數重新加入到函數調用棧中,接著就是前面所講的出棧。

 

 

 輸出結果是 "1" "2" "set2" "setTimeout"

第一步: setTimeout 是個非同步任務,回呼函數加入任務隊列,主線程先執行後續的任務。

第二步:for迴圈同步任務,  console.log("1") 先進棧,後出棧。

第三步: setTimeout 跟第一步處理一致。

第四步: for迴圈同步任務 console.log("2") 先進戰。後出棧。

第五步: 棧任務完成之後,會不斷輪詢,任務隊列中的回呼函數,回呼函數重新進入主線程的調用棧,輸出資料,完成出棧。

 

 

事件輪詢:

就是不斷重複上面所說的步驟,只要主線程棧執行完畢之後,就會取執行任務隊列中的回呼函數。完成進棧和出棧。

 

最後附上一張圖加以理解:

 

 

函數調用棧、任務隊列、事件輪詢

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.