JavaScript执行顺序

先同步后异步

Posted by Sheldon on February 16, 2017

先上一段代码:

setTimeout(function() {
  console.log('settimeout out')
  setTimeout(function() {
    console.log('settimeout in')
  }, 0);

  process.nextTick(function() {
    console.log('process.nextTick');
  });
}, 0);

setTimeout(function() {
  console.log('settimeout');
},0);

process.nextTick(function() {
  console.log('process.nextTick');
});

console.log('main thread');

// 输出结果:
// main thread
// process.nextTick
// settimeout out
// settimeout
// process.nextTick
// settimeout in

分析以上代码,首先代码根据顺序从上往下,依次执行,遇到同步任务就立即执行, 故先输出 main thread;遇到异步任务,会把异步任务放入任务队列, 由于异步任务中 process.nextTick() 操作优先级最高,故会先被执行; 然后输出setTimeout的异步任务,由于我在上面的第一个异步任务中加入了另一个setTimeout, 这个异步任务的数据会在最后执行。由于上述的setTimeout的时间都是0,所有可以从上述代码的 输出结果看出代码入队列的顺序

总结:首先在第一个时间片内,程序会遍历整个代码,然后将异步任务放入队列。然后继续执行 主线程上的代码,第一次轮询完成之后,进入队列找已经执行完成的任务,并执行其回调; 如果没有执行完成,那么跳过继续后面的任务;如果一个异步任务的回调中又有异步任务, 会继续加入任务队列;然后如此轮询直到所有的任务都执行完毕