同步回調、異步回調

1. js爲什麼是單線程?

       其實,JavaScript的單線程,與它的用途是有很大關係,JavaScript作爲瀏覽器的腳本語言,主要用來實現與用戶的交互,利用JavaScript,可以實現對DOM的各種各樣的操作,如果JavaScript是多線程的話,一個線程在一個DOM節點中增加內容,另一個線程要刪除這個DOM節點,那麼這個DOM節點究竟是要增加內容還是刪除呢?這會帶來很複雜的同步問題,因此,JavaScript是單線程的

2. 同步、異步

同步任務是指在主線程上排隊執行的任務,只有前一個任務執行完畢,才能繼續執行下一個任務,當我們打開網站時,網站的渲染過程,比如元素的渲染,其實就是一個同步任務

異步任務是指不進入主線程,而進入任務隊列的任務,只有任務隊列通知主線程,某個異步任務可以執行了,該任務纔會進入主線程,當我們打開網站時,像圖片的加載,音樂的加載,其實就是一個異步任務 (setTimeout、Promise、setInterval)

2. 同步函數、異步函數

let cb = function () {
  console.log(1)
}
function doworkNow (cb) {
  for (var i = 0; i< 10 ; i ++) {
    console.log(i)
  }
  cb(22)
  console.log(33)
}
doworkNow(cb)

按順序“0 1 2 3 4 5 6 7 8 9 22 33 ” 這種是同步,比如其中一個執行很慢,也得等着

let cb = function () {
  console.log(22)
}
function dowork (cb) {
  console.log('start')
  setTimeout(cb, 1000)
  console.log('end')
}
dowork(cb) // start end 22

這就是異步,其中有一個 1S 之後執行,先執行他後面的,1S到了再執行cb函數

總結:

setTimeout 是直接將延遲任務添加到延遲隊列中,而 XMLHttpRequest 發起請求,是由瀏覽器的其他進程或者線程去執行,然後再將執行結果利用 IPC 的方式通知渲染進程,之後渲染進程再將對應的消息添加到消息隊列中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章