JavaScript 是单线程的,只有JS引擎线程执行事件队列的事件。为了防止代码阻塞,JavaScript使用了异步执行机制。
参与JS代码执行过程的线程有4个:
Event-Loop是实现JavaScript异步的一种机制。
JavaScript 事件队列分为两种:宏任务(macro-task)队列和微任务(micro-task)队列。
常见的宏任务:I/O,setTimeout,setInterval,执行全局JavaScript代码,UI交互事件,postMessage,setImmediate(Node.js)
常见的微任务:Promise, MutationObserver,process.nextTick(Node.js)
事件循环通过两个原则处理浏览器事件,一是单线程处理方式,二是事件在执行过程中不会被其他事件中断(除非浏览器自己决定主动终端某个事件,比如浏览器主动关闭一些处理事件时间过长的事件进程,一般很少发生)。
事件循环过程:
在事件循环一个完整的迭代过程中,宏任务最多只执行一次,微任务队列则全部被执行,微任务主要目的是为了在下一次UI重绘之前更新程序状态。
微任务优先处理权,微任务队列执行完成之前会阻止浏览器UI渲染。
UI渲染发生在两个宏任务之间,并且UI渲染开始时微任务队列为空。
JavaScript 的事件队列的执行和添加是两个完全独立的过程,确保在事件循环过程中将浏览器监听到的新事件添加到对应事件队列中去,当前执行的事件处理不受影响。
console.log('js1');
setTimeout(function() {
console.log('setTimeout');
}, 0);
Promise.resolve().then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');
});
console.log('js2');
我们来分析上面代码执行过程:
// 运行结果
js1
js2
promise1
promise2
setTimeout
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。