说到宏任务和微任务,我们就不得不提 Event Loop 了
首先我们要知道两点:
- JavaScript是单线程的语言
- Event Loop是javascript的执行机制
javascript事件循环
-
一般来说,非阻塞性的任务采取同步的方式,直接在主线程的执行栈完成。
-
一般来说,阻塞性的任务都会采用异步来执行,异步的工作一般会交给其他线程完成,然后回调函数会放到事件队列中。
从图片可知,一个方法执行会向执行栈中加入这个方法的执行环境,在这个执行环境中还可以调用其他方法,甚至是自己,其结果不过是在执行栈中再添加一个执行环境。这个过程可以是无限进行下去的,除非发生了栈溢出,即超过了所能使用内存的最大值。
先看一段代码
console.log('script start');
setTimeout(function() {
console.log('setTimeout');
}, 0);
Promise.resolve().then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');