怨种同桌今天又突然call我问问题了,题目如下:
问以下代码的执行结果是什么?
console.log(1)
setTimeout(function() {
console.log(2)
new Promise(function(resolve) {
console.log(3)
resolve()
}).then(function() {
console.log(4)
})
})
new Promise(function(resolve) {
console.log(5)
resolve()
}).then(function() {
console.log(6)
})
setTimeout(function() {
console.log(7)
new Promise(function(resolve) {
console.log(8)
resolve()
}).then(function() {
console.log(9)
})
})
console.log(10)
答案是:1,5,10,6,2,3,4,7,8,9
分析如下:
首先要知道执行顺序是 同步代码 => 微任务 => 宏任务
微任务和宏任务的分类如下:
任务(代码) | 宏/微 任务 | 环境 |
---|---|---|
script | 宏任务 | 浏览器 |
事件 | 宏任务 | 浏览器 |
网络请求(Ajax) | 宏任务 | 浏览器 |
setTimeout() 定时器 | 宏任务 | 浏览器 / Node |
fs.readFile() 读取文件 | 宏任务 | Node |
Promise.then() | 微任务 | 浏览器 / Node |
注意new Promise()是同步代码,Promise.then()才是微任务
第一步执行同步代码 console.log()&new Promise()
所以首先执行了1,5,10
new Promise()的状态都是resolved所以then会执行故执行6
定时器是宏任务,放在最后执行2,3,4,7,8,9