js的宏任务及微任务详解
1.0什么是单线程?
单线程就是进程中只有一个线程在执行,只有前面的线程执行完了,后面的才可以继续,也就是不存在多个任务同时执行的情况。
1.1 为什么js是单线程
js是单线程语言,那么js之所以是单线程,其实与它的用途来不开关系,首先js开发之初是干嘛的?js作为浏览器的脚本语言,主要用来做与用户的交互的,我们可以通过JavaScript来操作dom,那么如果js是一门多线程语言,假如有一个线程是将这个dom删除,有一个线程是对这个dom进行操作,那么最终的结果将是非常混乱的,所以在开发之初就将他设置为单线程语言。
1.2 什么是同步任务和异步任务
- 同步任务是指主线程上排队的任务,只有当前一个任务执行完毕,后一个任务才可以开始执行,并不是两个任务同时进行的意思,是有严格的顺序执行的,当我们打开网站时,元素的渲染就是同步任务。
- 异步任务则是指任务不直接进入主线程,而是进入任务队列,当任务队列通知主线程说某个任务可以开始执行,该任务才会进入主线程,就比如我们打开网页时,图片和音乐的加载就是异步任务,因为他们的加载都需要较长的时间。假如是同步进行的,我把图片放在第一个位置,那么得等图片加载出来了,网页的其他内容才开始渲染,由此可见用户体验很不好
- 综上,我们可以看出同步任务和异步任务的差别,其实就是两者的执行顺序不同,同步任务有着严格前后顺序,而异步任务就是我一件事情还没做完,我可以先挂起,先做别的,等这件事情准备好了我再来继续做。
上图就是js的Event Loop,当主线程中的任务执行完毕以后,就会开始读取任务队列里的任务进入主线程中执行。
1.3什么是宏任务和微任务
-
异步任务又可以分为以下两种:宏任务和微任务
[1] 宏任务:- 异步Ajax请求
- setTimeOut、setInterval
- 文件操作
- 其他宏任务
[2]微任务:
- Promise.then、.catch、和.finally
- process.nextTick
- 其他微任务
综上,js的执行顺序为同步任务>微任务>宏任务
参考文章:https://juejin.cn/post/6844903512845860872
参考文章:https://blog.csdn.net/weixin_45811256/article/details/123731842
参考文章:https://www.jianshu.com/p/7c00d816bb43