**今天我们谈一下我对js 运行机制 和宏观任务、微观任务的理解**
js运行机制有同步运行和异步运行
js是单线程运行模式在进入任务当中如果是同步任务 那么就直接被主线程运行 如果是异步任务 那么就进入任务队列中进行等待运行 直到主线程任务执行完毕那么这时候就会调用异步任务 如下面这张被我盗的图所示
串联一下子 也就是说 同步和异步进入不同的任务中 同步的进入 主线程 异步的进入event table中 然后会在event table生成回调函数到event queue中 当主线程任务结束后 会去event queue中读取对应的函数进行执行 以上过程不断重复就是 js运行机制 event Loop
以上是js代码的一个运行机制 下面呢我们来讲一下宏观和微观
异步又分为宏观和微观 微观的优先级是大于宏观的 可能我描述的不清楚
宏观的事件有: html的解析 定时器 I/O、UI交互事件、postMessage、MessageChannel、setImmediate(Node.js 环境)
微观的事件有:promise的then和catch 等
ps:promise 在许多文章上被直接定义为微观任务 其实是有一定错误 promise本身是宏观 他的回调函数是异步 也就是.then .cantch 是微观任务
下图是宏观任务和微观任务的运行 ps:盗的图哟!!!
也就是说 在一个宏观任务中 只有微观任务全部运行完毕后才会继续执行下一个宏观任务
下面看一段代码
setTimeout(() => console.log("d"), 0);
Promise(function(resolve, reject) {
console.log(66)
resolve()
}).then(() => {
console.log(77)
});
console.log(88)
首先我们明确有几个宏观任务 setTimeout Promise
微观任务有 Promise.then()
首先 setTimeout 是异步宏任务执行 所以被扔进了 异步队列中进行等待 然后遇到了 Promise
promise本身是宏观任务 异步执行同步调用 所以会被主线程运行 所以 输出了 **66** 然后
遇到了.then 发现是微观任务 那么就放入到 异步对列中 主线程又运行了 console.log(88) 输出了 88 接下来
当主线成 任务运行完毕后 开始了调用异步对列中的函数调用 输出了77
这里会有人问 为什么 setTimeout 也在异步队列 中 为什么不先执行 setTimeout 呢 上面是做了解释
微观任务的 优先级比宏观任务高!!!所以先执行 .then() 输出77 再输出 d
promise 是 宏观任务 同步调用 所以在主线程运行的时候他会直接运行 所以 他会比setTimeOut先执行