下面是关于“浅谈javascript事件环微任务和宏任务队列原理”的完整攻略:
什么是事件循环?
事件循环是 JavaScript 的一种机制,它用于控制JavaScript代码的执行顺序,确保异步任务得到预期的执行结果,保证 JavaScript 是单线程的运行环境。
当执行JavaScript程序时,JavaScript引擎首先会将同步任务压入执行栈中,然后执行栈中的任务按照顺序执行,如果执行过程中遇到了异步任务,会将异步任务回调函数挂起并注册到对应的任务队列中等待执行。JavaScript 引擎将同步任务执行完毕后,会依次轮询各个任务队列中的任务并将任务放入执行栈中,等待执行。
宏任务
宏任务是 JavaScript 执行模型中的概念,顾名思义,大的任务就可以称之为宏任务。例如:browser UI rendering、用户输入、setTimeout 和 setInterval 等。
宏任务通过 Event Loop 机制可以异步地等待、等到当前执行栈被清空后再进入执行栈。
示例代码:
console.log(1);
setTimeout(() => {
console.log(2);
}, 0);
console.log(3);
输出结果为:1 3 2
执行顺序是按照函数调用顺序执行的,当执行 setTimeout()
函数时,会将该任务放入任务队列,由于是异步任务,因此不会阻塞执行栈的执行。当执行完 console.log(3)
后,执行栈为空,JavaScript 引擎会轮询任务队列并将任务放入执行栈中执行。此时,setTimeout()
函数的回调函数会被执行,程序会输出 2
。
微任务
微任务是 JavaScript 执行模型中的概念,大部分的异步任务都可以称之为微任务,例如:Promise、process.nextTick等。
与宏任务不同的是,微任务会在本轮事件循环的末尾执行,这就确保了宏任务和微任务之间的顺序关系。
示例代码:
console.log(1);
Promise.resolve('promise').then(data => console.log(data));
console.log(2);
输出结果为:1 2 promise
当调用 Promise.resolve()
时,会将该任务变成一个微任务,并将其放入微任务队列中。当执行完 console.log(2)
后,执行栈为空,JavaScript 引擎会检查是否存在微任务,如果存在,则会依次执行微任务队列中的所有任务,最后输出 promise
。
任务队列
任务队列其实就是一个数组,它存储了异步任务,并按照任务的到达顺序排列。事件循环的时候会在任务队列中查找任务并将任务放入执行栈中等待执行。
常见的任务队列包括以下几种:
- 宏任务队列:setTimeout、setInterval、requestAnimationFrame、I/O、UI rendering
- 微任务队列:Promise、process.nextTick
深入透彻掌握事件循环原理
JavaScript 的事件循环机制非常重要,能够掌握事件循环的原理可以帮助开发者更好的理解 JavaScript 异步编程机制。推荐阅读相关书籍或者文档进行深入学习。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈javascript事件环微任务和宏任务队列原理 - Python技术站