美文网首页
事件队列以及JS执行顺序

事件队列以及JS执行顺序

作者: JLong | 来源:发表于2021-01-14 09:43 被阅读0次

JavaScript是一门单线程语言,所谓单线程,就是指一次只能完成一件任务,如果在同个时间有多个任务的话,这些任务就需要进行排队,前一个任务执行完,才会执行下一个任务,这种存放待执行任务的队列就叫做事件队列。

然后js有一个机制分为宏任务和微任务,用来规范事件队列的执行顺序,宏任务和微任务分别存放在不同的event loop,这两个队列分别为macrotack queue和microtack queue.

Macrotack(宏任务):

script(整体代码)例如console.log、setTimeout、setInterval、setImmediateI/O、UI交互事件、postMessage、MessageChannel

Microtack(微任务):

await后面代码、Promise.then、MutationObserver、process.nextTick(Node环境)

注:

await做了什么

从字面意思上看await就是等待,await 等待的是一个表达式,这个表达式的返回值可以是一个promise对象也可以是其他值。

很多人以为await会一直等待之后的表达式执行完之后才会继续执行后面的代码,实际上await是一个让出线程的标志。await后面的表达式会先执行一遍,将await后面的代码加入到microtask中,然后就会跳出整个async函数来执行后面的代码。

由于因为async await 本身就是promise+generator的语法糖。所以await后面的代码是microtask

例子

setTimeout(function() {

console.log(1)

}, 0);

new Promise(function(resolve, reject) {

console.log(2)

for (var i = 0; i < 10000; i++) {

if(i === 10) {console.log(10)}

i == 9999 && resolve();

}

console.log(3)

}).then(function() {

console.log(4)

})

console.log(5);

输出答案为2 10 3 5 4 1

执行顺序为:同步执行的代码

console.log=promise>promise.nextTick>promise.then>setTimeout>setImmediate

promise( console.log(1))   cosole.log(2) // 1 2

console.log(2)    promise(console.log(1))  // 2 1

宏任务 微任务 慢执行的宏任务分别代表:console promise settimeout

微任务:process.nextTick、MutationObserver、Promise.then catch finally

宏任务:I/O、setTimeout、setInterval、setImmediate、requestAnimationFrame

相关文章

  • 事件队列以及JS执行顺序

    JavaScript是一门单线程语言,所谓单线程,就是指一次只能完成一件任务,如果在同个时间有多个任务的话,这些任...

  • 详解JavaScript的任务、微任务、队列以及代码执行顺序

    摘要: 理解JS的执行顺序。 作者:前端小智 原文:详解JavaScript的任务、微任务、队列以及代码执行顺序 ...

  • js笔记

    Javascript 事件循环: js解析方法时,将同步任务排队到执行栈中,异步任务排队到事件队列中。 事件队列分...

  • 运行机制,宏任务 与 微任务

    运行机制: JS 的本质是单线程执行 事件队列:同步任务,异步任务() 运行机制 1,JS 的本质是单线程执行 单...

  • js执行顺序

    JavaScript是一种描述型脚本语言,由浏览器进行动态的解析与执行,浏览器对于不同的方式有不同的解析顺序,详细...

  • js执行顺序

  • 事件循环机制

    JS 有个全局的函数执行栈,这是执行同步函数的地方 除了函数执行栈,还有一个事件队列,这是执行异步函数的地方 异步...

  • Mysql进阶知识笔记

    一、SQL执行顺序以及常见SQL的join查询 sql执行顺序: 手写 机读顺序 sql机器执行顺序sql机器执行...

  • js中函数执行顺序以及变量提升

    例题 我这就不卖关子了,输出的结果分别是:2、4、1、1、2、3、3不知你答对了吗? 解析 下面进入重点,我们进行...

  • js代码的异步执行方式

    由于JavaScript的执行环境是单线程的,导致js代码的两种执行方式: 以js代码的先后顺序执行的顺序型 以事...

网友评论

      本文标题:事件队列以及JS执行顺序

      本文链接:https://www.haomeiwen.com/subject/fdgeaktx.html