標籤: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") 先進戰。後出棧。
第五步: 棧任務完成之後,會不斷輪詢,任務隊列中的回呼函數,回呼函數重新進入主線程的調用棧,輸出資料,完成出棧。
事件輪詢:
就是不斷重複上面所說的步驟,只要主線程棧執行完畢之後,就會取執行任務隊列中的回呼函數。完成進棧和出棧。
最後附上一張圖加以理解:
函數調用棧、任務隊列、事件輪詢