共计 1346 个字符,预计需要花费 4 分钟才能阅读完成。
习题
实践是检验真理的唯一标准
// 第一题
console.log(1)
setTimeout(()=>{console.log(3)
})
setTimeout(()=>{console.log(4)
})
var p = new Promise((res,rej)=>{console.log(5)
res()})
p.then(()=>{console.log(6)
})
console.log(2)
// 执行顺序 1 5 2 6 3 4
// 第二题
let fn = () => {console.log(1)
let a = new Promise((resolve, reject) => {console.log(2)
resolve(3)
})
console.log(4)
return a
}
fn().then(data => console.log(data))
// 执行顺序 1 2 4 3
setTimeout 和 setInterval、Promise 是分层执行
这里涉及一个 宏任务和微任务的概念
宏任务和微任务
微任务(Microtasks)
宏任务(task)
js 会优先执行宏任务 宏任务可以同时有多个 但会按顺序一个一个执行
每一个宏任务 后面都可以跟一个微任务队列 如果微任务队列中有指令或方法 那么就会执行 如果没有 则开始执行下一个宏任务 直到所有的宏任务执行完为止
宏任务占用性能 需要一些较早就准备好的方法 排在最后才执行的时候 又不想新增一个宏任务 那么就可以把这些方法 一个一个的放在微任务队列里面 在这个宏任务中的代码执行完后 就会执行微任务队列
// 第一题 解析
console.log(1) // 1 宏任务
setTimeout(()=>{ // 1 宏任务
console.log(3) // 延后执行
})
setTimeout(()=>{ // 1 宏任务
console.log(4) // 延后执行
})
var p = new Promise((res,rej)=>{ // 1 宏任务
console.log(5)
res()})
p.then(()=>{ // 微任务
console.log(6)
})
console.log(2) // 1 宏任务
// 第一轮 先把宏任务执行完毕
// 第二轮 Promise 参数有了 先执行 后执行延后任务
// 第二题同理
如果还没有明白 就看这个
console.log('第一轮 宏 1')
Promise.resolve().then(() => {console.log('第二轮 Promise 宏》微 1')
Promise.resolve().then(() => {console.log('第三轮 Promise 宏》微 1》(宏这里没有需要执行的东西)》微')
Promise.resolve().then(() => {console.log('第四轮 Promise 宏》微 1》(宏这里没有需要执行的东西)》微》(宏这里没有需要执行的东西)》微')
}) // 新加行
}) // 新加行
})
setTimeout(() => {console.log('最后一轮 setTimeout 延后执行')
});
Promise.resolve().then(() => {console.log('第二轮 Promise 宏》微 2')
})
setTimeout(() => {console.log('最后一轮 setTimeout 延后执行')
});
console.log('第一轮 宏 2')
正文完
发表至: javascript
2019-11-01