- 在讲这个之前,我们先搞懂,js的运行机制是什么样的:
- 一.关于Javascript运行机制:
- 二.任务队列
在讲这个之前,我们先搞懂,js的运行机制是什么样的:
一.关于Javascript运行机制:
首先js是单线程语言,也就是说同一时间只能干一件事情,只有前面的事情执行完,才能执行后 面的事情,就好像只有一个窗口的银行,客户需要排队一个一个办理业务,js任务就是一个一个按照顺序执行,如果一个任务耗时过长,那么后一个任务也必须等着,那么问题来了,假如我们想浏览新闻,但是新闻包含的超清图片加载很慢,难道我们的网页要一直卡着直到图片完全显示出来?
因此我们将任务分为两类: 同步任务 和 异步任务
那么什么又是同步任务什么又是异步任务呢??
● 1. 同步任务:
console.log('红烧肉');
console.log('鱼香肉丝');
for (let i = 1; i <= 5; i++) {
console.log(i);
}
输出结果:
也就是说,同步代码会按照顺序依次执行
● 2. 异步任务:
setTimeout(() => {
console.log('定时器')
},3000)
console.log('执行console');
输出结果:
按理来说,应该先执行’定时器’,再执行’console’,但是这个执行顺序确实相反的,setTimeout就是异步任务,setTimeout的定时器 不管延迟多少毫秒 也是异步的,但定义了0 最小也是4毫秒
二.任务队列
通过上面的代码,我们知道了代码执行的顺序, 同步任务 > 异步任务, 所以说 在任务队列中 分为两大类 : 1.同步任务 2. 异步任务
除了广义的同步任务和异步任务,我们对任务有更精细的定义:
微任务(micro-task): Promise,process.nextTick
宏任务(macro-task): 包括整体代码script,setTimeout,setInterval
执行顺序是 微任务 > 宏任务
代码演示:
setTimeout(() => {
console.log('定时器');
}, 0)
new Promise((resolve) => {
console.log('同步代码')
resolve('异步代码')
}).then((res) => {
console.log(res);
})
console.log('奥特曼');
输出结果:
![image.png](https://cdn.nlark.com/yuque/0/2021/png/21762447/1624032023871-556bdeae-b56d-4623-bec5-6a00f7dd592c.png#clientId=u65cc569b-9ac1-4&from=paste&height=139&id=uffda9f58&margin=%5Bobject%20Object%5D&name=image.png&originHeight=139&originWidth=244&originalType=binary&ratio=1&size=4025&status=done&style=none&taskId=u416c047e-06d5-44b6-9f89-522cdca2b7b&width=244) <br /> 事件执行顺序: 代码从上往下执行,setTimeout是宏任务.先去任务队列排队,然后发现'同步代码'