
对于上述代码,我的理解:
- 第 4 行
.then方法所属对象已经resolved,所以 5 ~ 20 行代码进入微任务队列 - 跳转第 21 行,
.then方法所属对象pending中,所以将 23 ~ 25 行加入第 5 行函数返回值对象的PromiseFulfill属性中 - 同步代码结束,从微任务队列中取出 5 ~ 20 行代码执行
- 6 ~ 8 行创建一个 resolved Promise 对象,所以 10 ~ 12 行代码进入微任务队列,14 行的
then会将 15 ~ 17 行的代码加入第 9 行函数返回值对象的PromiseFulfill属性中 - 5 ~ 20 行代码执行结束,所以第 5 行返回的期约对象落定为
resolved,因此将 23 ~ 25 行加入微任务队列 - 目前微任务队列中有两个任务,10 ~ 12 、23 ~ 25 ,在执行 10 ~ 12 后(打印 333 ),15 ~ 17 被加入微任务队列,然后执行 23 ~ 25 (打印 555 ),然后执行 15 ~ 17 (打印 444 )
实际输出和我上述的理解是一致的( 333 、555 、444 )。
按照 JavaScript 高级程序设计(第 4 版) 330 页的说法:
如果没有显式的返回语句,则 Promise.resolve()会包装默认的返回值 undefined 。
那实际上面例子中 5 ~ 20 行代码,是没有显式的返回语句的,按照我的理解,就相当于执行了 19 行的return Promise.resolve(),但是当我取消注释 19 行后,输出结果变成了 333 、444 、555 。结果和我已经形成的理解不一致,想不太明白,还请各位老师帮助答疑解惑,万分感谢。

