同步回调、异步回调

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 的方式通知渲染进程,之后渲染进程再将对应的消息添加到消息队列中。

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