1. 程式人生 > >js單執行緒和非同步並不衝突

js單執行緒和非同步並不衝突

眾所周知,js是單執行緒的,但是我們又經常說js非同步,這是為什麼呢?

實際上瀏覽器的渲染過程是多執行緒的,它不只有js一個執行緒,它還有GUI渲染執行緒、事件觸發執行緒、定時觸發器執行緒、非同步http請求執行緒等執行緒

js一次只能執行一個任務,當他有許多工時,由於單執行緒,所以這些任務只能形成一個任務佇列排隊一個一個來,但前端的某些任務是非常耗時的,比如網路請求,定時器和事件監聽,如果讓他們和別的任務一樣,都老老實實的排隊等待執行的話,執行效率會非常的低,甚至導致頁面的假死。所以,瀏覽器為這些耗時任務開闢了另外的執行緒,主要包括http請求執行緒,瀏覽器定時觸發器,瀏覽器事件觸發執行緒,這些任務是非同步的

所以說js單執行緒和非同步並沒有什麼關係。
舉個例子

setTimeout(function(){
console.log(1);
},0);
console.log(2);

輸出是 2 1
我們來分析一下過程,js在執行時,首先要檢視當前任務佇列中有沒有任務,從上到下,首先遇到定時器,瀏覽器會開啟一個定時器執行緒,繼續往下,console.log(2),放入佇列,當定時器程序執行完後,推入到佇列中,然後開始執行,輸出2, 1,這就是所謂的非同步。