摘星┃星的人

文章 评论 浏览 31

摘星┃星的人 2022-05-04 13:57:48

主调用栈流程:

  1. heap存放函数对象async1
  2. heap存放函数对象async2
  3. console.log同步方法执行,打印 script start
  4. setTimeout函数执行,一个函数由定时器线程指定何时加入异步队列,这里是0ms,理论上应该主调用栈执行完毕后,第一个加入第一个异步队列,各浏览器可能有区别
  5. async1函数被执行,主调用栈压入async1 context,执行上下文,log被执行,打印 async1 start; await async2被调用,相当于Promise.resolve(async2()).then被执行;后续代码被放在then方法中执行
  6. 首先同步执行 async2,调用栈压入 async2 context,执行上下文,打印 async2,执行完毕,弹出async2 context,回到async1 context
  7. 由于async2没有返回promise,所以创建一个空的,reoslve为undefined的promise以供then调用,步骤5 await之后被放入微任务队列
  8. 退出async1 context;执行执行后续主调用栈,new Promise(func)中代码被执行,打印 promise1,然后调用resolve,此promise状态变为fulfilled,后续then方法被放入微任务队列
  9. 继续执行主调用栈,打印script end
  10. 主调用栈执行完毕,event loop开始检查微任务队列的任务,按照先进先出执行,第一个微任务压入主调用栈执行
  11. 执行打印async1 end;执行完毕,第二个微任务压入调用栈执行,打印 promise2 第二个微任务执行完毕,调用栈清空
  12. event loop检查微任务全部执行完毕,开始检查宏任务列表,有一个setTimeout产生的任务被压入调用栈执行; 打印setTimeout
  13. 执行完毕之后,清空调用栈,event loop检查是否有微任务列表,发现无新的微任务,检查宏任务列表也无新的宏任务,调用栈进入闲置状态

所以打印顺序为

  • script start
  • async1 start
  • async2
  • promise1
  • script end
  • async1 end
  • promise2
  • setTimeout

第 10 题:常见异步笔试题,请写出代码的运行结果

摘星┃星的人 2022-05-04 13:50:18
function f(x){
    return g(x);
}
// 非尾调用
function f(x){
    return g(x) + 1;
}

谁能帮我解释下这俩的执行上下文栈有啥区别么

JavaScript 专题之递归

摘星┃星的人 2022-05-04 13:34:48

我起的早, 我先来吧

受思维惯性, 以为是求连续, 好吧, 修改了一波

function formArray(arr: any[]) {
  const sortedArr = Array.from(new Set(arr)).sort((a, b) => a - b);

  const map = new Map();

  sortedArr.forEach((v) => {
    const key = Math.floor(v / 10);
    const group = map.get(key) || [];
    group.push(v);

    map.set(key, group);
  });

  return [...map.values()];
}

// 求连续的版本
function formArray1(arr: any[]) {
  const sortedArr = Array.from(new Set(arr)).sort((a, b) => a - b);

  return sortedArr.reduce((acc, cur) => {
    const lastArr = acc.slice().pop() || [];

    const lastVal = lastArr.slice().pop();
    if (lastVal!=null && cur-lastVal === 1) {
      lastArr.push(cur);
    } else {
      acc.push([cur]);
    }

    return acc;
  }, []);
}

function genNumArray(num: number, base = 100) {
  return Array.from({length: num}, () => Math.floor(Math.random()*base));
}

const arr = genNumArray(10, 20); //[2, 10, 3, 4, 5, 11, 10, 11, 20];
const res = formArray(arr);

console.log(`res ${JSON.stringify(res)}`);

第 67 题:随机生成一个长度为 10 的整数类型的数组

更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文