这是一个很经典的面试题,大家都说微任务的优先级更大所以会优先执行,但是why?
实际上js会先执行一个宏任务,在执行微任务,但是为什么微任务会先执行呢?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
setTimeout(() => {
console.log(1)
}, 0);
new Promise((rej)=>rej(2)).then((data)=>
console.log(data)
)
</script>
</body>
</html>
为什么会输出2,1呢,该怎么去解释呢?
其实真正会造成微任务优先级大于宏任务,是因为script本来就是一个宏任务,所以会先执行script这个宏任务,这个宏任务执行完又添加了一个宏任务(计时器),一个微任务(promise),但是执行完一个宏任务,该执行当前所有的微任务,所以先输出2,执行完微任务,再去循环调用,在执行一个宏任务,也就是定时器,执行完,发现微任务为空,就暂停,等待任务的到来,这就是事件循环的原理eventloop。
所以在做一些面试题的过程中,我们不需要知道真正的原理,只需要记住微任务优先级大于宏任务就可以得出真正的答案!