面试题分析--判断输入输出

本文分析了JavaScript面试中关于宏任务与微任务、Promise、this指向、构造函数创建对象方式的问题。详细解释了代码执行顺序,包括setTimeout、Promise、箭头函数中的this、构造函数及React组件的生命周期与useState使用。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值