在学习 JavaScript 过程中,事件循环机制是必须要掌握的知识点之一。本文将详细介绍 JavaScript 事件循环机制的原理,以及宏任务和微任务的概念及异同点,其中包含两个示例说明。
JavaScript 是单线程执行的,意味着同一时间只能执行一段代码。然而在 Web 世界中,我们需要处理大量的事件,比如鼠标点击、异步请求等。如果执行这些事件的时候还需要等待之前的事件执行完毕,那会导致页面卡顿,影响用户体验。因此我们需要一种机制来异步处理这些事件,这就是事件循环机制。
事件循环机制的原理就是不断地从事件队列中取出事件并执行,当队列为空时,就等待新的事件进入队列。事件的触发可以是用户交互、定时器、网络请求等。事件的回调函数会被分配到不同的队列中,分别是宏任务队列和微任务队列。
宏任务就是当前 JavaScript 任务队列中的任务,同一时间只有一个宏任务在执行。在浏览器中,宏任务包括:页面渲染、用户交互事件、定时器等。
微任务是宏任务中的一段异步代码,和宏任务不同的是,同一时间可以有多个微任务在执行。在浏览器中,微任务包括:Promise、MutationObserver。
宏任务和微任务最大的区别在于执行时机的不同。
console.log('script start');
setTimeout(function() {
console.log('setTimeout');
}, 0);
Promise.resolve().then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');
});
console.log('script end');
以上代码执行结果为:
script start
script end
promise1
promise2
setTimeout
解释:
console.log('script start');
为同步任务,输出 "script start"
;setTimeout
为异步任务,被分配到宏任务队列中,等待同步任务执行完毕后执行;Promise
为异步任务,被分配到微任务队列中。由于在执行完同步任务后,先执行微任务队列中的所有任务,因此先输出 "promise1"
,再输出 "promise2"
;"setTimeout"
。console.log('1');
setTimeout(function() {
console.log('2');
}, 0);
Promise.resolve().then(function() {
console.log('3');
}).then(function() {
setTimeout(function() {
console.log('4');
}, 0);
});
console.log('5');
以上代码执行结果为:
1
5
3
2
4
解释:
console.log('1');
为同步任务,输出 "1"
;setTimeout
为异步任务,被分配到宏任务队列中,等待同步任务执行完毕后执行;Promise
为异步任务,先输出 "3"
,然后继续执行微任务队列中的任务;setTimeout
为异步任务,被分配到宏任务队列中,等待微任务队列中的任务执行完毕后执行;"2"
和 "4"
。以上就是 JavaScript 事件循环机制的原理和宏任务微任务的概念及异同点的详细说明,希望对你有所帮助。
本文链接:http://task.lmcjl.com/news/8961.html