工作生活

js运行机制题型

2019-07-03  本文已影响0人  离陌夕

js运行的顺序是同步任务-》微任务栈-》宏任务栈,然后一直按照这个顺序

  console.log(1);
  new Promise((resolve, reject) => {
    console.log(2);
    resolve();
    setTimeout(() => {
      console.log(3);
    }, 0);
  }).then(function() {
    console.log(4);
    setTimeout(function () {
      console.log(5);
    }, 0);
  });
  // 上面的运行结果为1 2 4 3 5

第一行是同步任务,所以先执行,输出1;
new Promise()这部分也是同步任务,所以输出2;碰到setTimeout放到宏任务栈;
接着执行碰到promise.then这个微任务,所以先执行,输出4;
又碰到setTimeout这个宏任务,放到宏任务栈;
第一个setTimeout先到时间,所以输出3;
最后输出5;

 console.log(1);
  new Promise((resolve, reject) => {
    console.log(2);
    resolve();
    setTimeout(() => {
      console.log(3);
    }, 100);
  }).then(function () {
    console.log(4);
    setTimeout(function () {
      console.log(5);
    }, 0);
  });
// 上面的输出结果是1 2 4 5 3

更复杂的一种:

  console.log(1);
  new Promise((resolve, reject) => {
    console.log(2);
    resolve();
  }).then(function () {
    console.log(3);
    setTimeout(function () {
      console.log(4);
    }, 0);
  });
  setTimeout(function () {
    console.log(5);
    new Promise((resolve, reject) => {
      console.log(6);
      resolve();
    }).then(function () {
      console.log(7);
      setTimeout(function () {
        console.log(8);
      }, 0);
    });
  }, 0);
  // 上面的运行结果为1 2 3 5 6 7 4 8

改个时间就不一样了

  console.log(1);
  new Promise((resolve, reject) => {
    console.log(2);
    resolve();
  }).then(function () {
    console.log(3);
    setTimeout(function () {
      console.log(4);
    }, 0);
  });
  setTimeout(function () {
    console.log(5);
    new Promise((resolve, reject) => {
      console.log(6);
      resolve();
    }).then(function () {
      console.log(7);
      setTimeout(function () {
        console.log(8);
      }, 0);
    });
  }, 10);
  // 上面的运行结果为1 2 3 4 5 6 7 8
上一篇 下一篇

猜你喜欢

热点阅读