先上一段网上的代码
setTimeout(function() { console.log('timeout1'); }) new Promise(function(resolve) { console.log('promise1'); for(var i = 0; i < 1000; i++) { i == 99 && resolve(); } console.log('promise2'); }).then(function() { console.log('then1'); }) console.log('global1');
结果 promise1 => promise2 => global1 => then1 => timeout1
简单按优先级划分 => 上下文中的执行代码(如代码中的console.log('promise1')、console.log('global1'))>Promise.then>setTimeout=setInterval
按原理分析 => 执行顺序 : 宏任务(包括js文件中的执行代码, setTimeout, setInterval等)
->
执行栈(当前运行的栈区) ->
微任务(Promise等)
setTimeout是一个宏任务 即marcotask,所以里面的console.log('timeout1')回调函数会被加到宏任务队列中 但不会立即执行
Promise是一个微任务 即microtask,所以Promise运行执行输出promise1以及promise2后Promise.then会被加到微任务队列中 也同样不会立即执行
继续执行 输出console.log('global1') 后执行栈上的代码已经执行完毕,根据上方的执行顺序 此时执行微任务队列,而此时微任务队列上有console.log('then1')因此立即输出
到此为止,一轮的事件循环已经执行完毕,开启新的一轮事件循环 =>即宏任务
->
执行栈->
微任务
但
由于此时宏任务上有事件console.log('timeout1')因此输出timeout1