eventloop

2020-06-23  本文已影响0人  颖小李

参考:
https://blog.csdn.net/u012925833/article/details/89306184
详解JavaScript中的Event Loop(事件循环)机制

1.为什么JS是单线程的?
为了保证程序的一致性,避免多个线程对同一个DOM元素 既删除又添加事件。

2.JS是如何实现非阻塞的呢?
执行异步任务时,不是一直等待返回结果,而是会挂起这个任务,在任务返回结果后再按一定的规则去执行相应的回调

3.异步任务是有类型,宏任务和微任务。遇到异步任务后,会将其分别放到宏任务队列和微任务队列中。在当前执行栈中的同步代码运行完之后,先执行微任务队列中的任务,再执行宏任务队列。在执行微任务队列中的任务时,如果又遇到微任务,会放到微任务队列中的队尾,遇到宏任务时,就放到宏任务队列中的队尾。
如果在宏任务队列里又遇到微任务,说是在执行完当前宏任务之后,会检查微任务队列执行微任务,微任务队列清空之后,再重新执行剩下的宏任务队列。
后续的宏任务和该微任务的执行顺序不定,有时宏任务先执行,有时微任务先执行。

setTimeout 、setTimeout 是宏任务
Promise 、 async await、MutaionObserver 是微任务

  1. 为什么要了解事件循环的执行顺序?
    合理的使用各种延迟事件的方法,有助于代码更好的按照其优先级去执行。

5.当前执行栈——微任务队列——宏任务队列 。执行队列里的任务时,是在当前执行栈中执行的,执行之后又一次检查两个队列。

6.当前执行栈执行完毕时会立刻先处理所有微任务队列中的事件,然后再去宏任务队列中取出一个事件。同一次事件循环中,微任务永远在宏任务之前执行。
有多次事件循环吗?以什么判断本次事件循环结束下一次事件循环开始了呢?

7.为什么有些浏览器会在执行顺序上有不同的表现呢?
其实是因为“将promise作为task还是microtask引起的”,不同浏览器的解析不一样

下面代码的打印顺序是如何的?

console.log('script start');
 
setTimeout(function() {
  console.log('setTimeout');
}, 0);
 
Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});
 
console.log('script end');

//正确答案是: script start, script end, promise1, promise2, setTimeout,
//a 的初始值为true和false时,执行结果分别是什么
var a = false; 
setTimeout(function(){
  a = !a;
  console.log(a)
}, 100)
while(a){
    console.log('while执行了')
}

上一篇 下一篇

猜你喜欢

热点阅读