1.为什么JS是单线程的
js是运行于浏览器的脚本语言,因其经常涉及操作dom,如果是多线程的,如果一个线程修改dom,另一个线程删除dom,那么浏览器就不知道该先执行哪个操作,所以js执行的时候会按照一个任务一个任务来执行,那么任务是怎么排列的呢
2.为什么JS的任务要分类为同步任务和异步任务
试想一下,如果js的任务都是同步的,那么遇到定时器、网络请求等这类型需要延时执行回调函数的任务会发生什么?页面会像瘫痪一下暂停下来等待这些需要需要时间的代码执行完毕,基于此,又引入了异步任务,每个异步任务都必须引入
- 同步任务:同步任务不需要进行等待可立即看到执行结果,比如console
- 异步任务:异步任务需要等待一定的时候才能看到结果,比如setTimeout、网络请求
-
例子①
示例一我们可以看到既有同步任务也有异步任务,那么在主线程执行的过程中就会把两个定时器中的回调函数注册到异步事件队列里面,最后输出1 2 3 4,但是为什么是第二个setTimeout先输出,很明显从代码中可以看到是因为等待的时间不同,但是如果是网络请求呢,那时间不像是定时器一样提前规定好的,为了解决这个问题设置了消息队列,也可以理解为事件监听器
console.log(1) // 同步任务
setTimeout(() => { // 异步任务
console.log(4)
}, 2000)
setTimeout(() => { // 异步任务
console.log(3)
}, 1000)
console.log(2) // 同步任务
3.为什么异步任务中要设置消息队列(事件监听)
事件监听器可以监听异步任务的状态,如果已经可以执行回调就会将对应的任务放到事件队列中
- 例子①
示例一假设了两个网络请求,监听器会先监听到第二个请求得到响应,那么会先执行第二个的回调,所以下面这段代码的输出是1 2 3 4
console.log(1) // 同步任务
ajax().then(() => { // 异步任务且假设3s后得到响应
console.