1. 考察点:宏任务与微任务、Promise
new Promise(() => {
setTimeout(() => {
console.log(0)
})
console.log(1)
throw new Error('')
console.log(2)
}).then(() => {
console.log(3)
}, () => {
console.log(4)
}).catch(() => {
console.log(5)
}).then(() => {
console.log(6)
})
输出:
1
4
6
0
分析:
(1) 首先执行整个代码块,即一个Promise,它内部的初始化函数会以同步方式执行
(2) 首先执行setTimeout,会将()=>console.log(0)这个回调函数放到宏任务队列中
(3) 执行console.log(1),之后抛出异常,进入后面的链式调用
(4) 在then方法中进入错误处理函数() => console.log(4),返回状态resolve
链式调用中有个then()和catch()容易看成跳过then方法进入catch分支,其实then方法接收两个处理函数,分别处理成功、失败的情况,我们一般在then中只设置一个函数来处理成功的情况,将失败的情况放到catch中处理,这是因为当只设置一个函数时,即只设置了成功时的处理函数,失败的情况未被处理,状态会继续向后传递。而设置两个处理函数时,失败时的处理函数会被设置,在未抛出错误的情况下,会处理这个错误,并将返回状态为resolve的状态。所以此时可以进入后面的then
(5) 返回状态为resolve,所以会跳过catch进入then,执行() => console.log(6)
(6) Promise的catch和then都是微任务,js的event loop机制会先执行一轮宏任务中的所有同步任务和所有微任务,再执行下一轮宏任务,所以console.log(0)在这里最后执行
2. 考察点:this指向与作用域、var效果、构造函数创建对象的方式
var a = 10;
var obt = {
a: 20,
fn: fu