每日一测(三)

Promise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
setTimeout(function (){
console.log(1);
},0);
new Promise (function executor (resolve) {
console.log(2);
for (var i = 0; i < 1000; i++) {
i = 9999 && resolve();
}
console.log(3)
}).then(function() {
console.log(4)
})
console.log(5);

答案:2 3 5 4 1

  1. 首先执行script下的宏任务,遇到setTimeout,将其放到宏任务的【队列】中。
  2. 遇到new Promise直接执行,打印2
  3. 遇到for循环直接执行,遇到then方法是微任务,放到【队列】中
  4. 打印3
  5. 打印5
  6. 本轮宏任务执行完成,查看本轮微任务,打印4
  7. 到此,本轮的 event loop 全部完成
  8. 下一轮中,执行一个宏任务,发现宏任务【队列】中有一个setTimeout函数,打印1

setTimeout()

1
2
3
setTimeout(function() {
console.log('执行了');
}, 3000);

一般我们对这段代码的理解是,3秒后打印执行了,但是这种说法并不严谨。准确来说,是3秒后,会把setTimeout()里的函数推入event queue,而event queue中的任务,只有在主线程空闲时才会执行。

所以只有满足(1)3秒后(2)主线程空闲时,才会执行该函数。

如果主线程执行任务很多,执行时间超过了3秒,比如执行了10秒,那么这个函数只能10秒后执行。

参考文章: