這裏主要記錄在平常中對知識的學習,經過結合筆記與自身理解的方式嘗試寫下總結
文章對細節可能不會一一介紹解釋,內容僅做參考
複製代碼
單線程就意味着,全部的任務都須要排隊,當前一個任務結束時,纔會執行後一個任務。若是前一個任務耗時很長,後一個任務就不得不一直等待。 若是是由於計算量大,CPU忙不過來倒也正常,可是不少時候CPU是閒着的,由於IO設備(輸入輸出設備)很慢(好比Ajax操做從網絡讀取數據),不得不等着結果出來,再往下執行。javascript
這時主線程徹底能夠無論IO設備,掛起處於等待中的任務,先運行排在後面的任務。等到IO設備返回告終果,再回過頭,把掛起的任務繼續執行下去。因而,全部任務能夠分紅兩種:java
在這裏用一張圖來講明:面試
除了廣義的同步任務和異步任務,會對任務有更精細的定義:promise
不一樣類型的任務會進入對應的Event Queue,好比setTimeout和setInterval會進入相同的Event Queue瀏覽器
第一次進入總體代碼(宏任務)後,開始第一遍循環,在主線程任務所有執行完畢後,會先去讀取全部的微任務進行執行,而後再到宏任務,而宏任務裏面或許又包含着宏任務與微任務。以此不斷循環執行網絡
用一張圖說明:異步
舉個栗子函數
setTimeout(function() {
console.log('setTimeout')
})
new Promise(function(resolve) {
console.log('promise')
resolve()
}).then(function() {
console.log('then')
})
console.log('console')
複製代碼
在理解時候須要將上面提到的兩點結合起來(同步異步 + 宏觀微觀),纔會造成機制。在代碼運行時,能夠想成是以代碼片斷來工做的oop
19.4.11 補充:今天在刷文章的時候看到相關的題目,感受能夠加深理解一波學習
console.log('sync1')
setTimeout(function (){
console.log('setTimeout')
}, 0)
var promise = new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('setTimeout-Promise')
}, 0)
console.log('promise')
resolve()
})
promise.then(() => {
console.log('promise-Then')
setTimeout(function() {
console.log('promise-Timeout')
}, 0)
})
setTimeout(function() {
console.log('lastSetTimeout')
}, 0)
console.log('sync2')
複製代碼
面試相關: