JS的同步和异步、微任务和宏任务

本文详细介绍了JavaScript为何采用单线程,以及同步任务和异步任务的区别。异步任务分为宏任务和微任务,分别对应不同的执行顺序。文章通过多个示例说明了宏任务和微任务的执行流程,帮助读者理解JavaScript的事件循环机制。
摘要由CSDN通过智能技术生成

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.
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值