js 微观任务、宏观任务、循环机制

javascript是单线程语言,就是因为单线程的特性;就不得不提js中的同步和异步。

同步和异步:
所谓单线程,无非就是同步队列和异步队列,js代码是自上向下执行的,在主线程中立即执行的就是同步任务,比如简单的逻辑操作及函数,而异步任务不会立马执行,会挪步放到到异步队列中,比如ajax、promise、事件、计时器等等。

先执行同步,主线程结束后再按照异步的顺序再次执行。

事件循环:同步任务进入主线程,立即执行,执行之后异步任务进入主线程,这样循环。

宏观任务和微观任务(先执行微观任务,再执行宏观任务);

在事件循环中,每进行一次循环操作称为tick,tick 的任务处理模型是比较复杂的,里边有两个词:分别是 Macro Task (宏任务)和 Micro Task(微任务)。

简单来说:

宏观任务主要包含:setTimeout、setInterval、script(整体代码)、I/O、UI 交互事件、setImmediate(Node.js 环境)

微观任务主要包括:Promise、MutaionObserver、process.nextTick(Node.js 环境)

规范:先执行微观任务,再执行宏观任务

那么我们知道了,Promise 属于微观任务, setTimeout、setInterval 属于宏观任务,先执行微观任务,等微观任务执行完,再执行宏观任务。所以我们再看一下这个代码:

console.log(‘开始111’);

setTimeout(function() {

console.log(‘setTimeout111’);

}, 0);

Promise.resolve().then(function() {

console.log(‘promise111’);

}).then(function() {

console.log(‘promise222’);

});

console.log(‘开始222’);

我们按照步骤来分析下:

1、遇到同步任务,直接先打印 “开始111”。
2、遇到异步 setTimeout ,先放到队列中等待执行。
3、遇到了 Promise ,放到等待队列中。
4、遇到同步任务,直接打印 “开始222”。
5、同步执行完,返回执行队列中的代码,从上往下执行,发现有宏观任务 setTimeout 和微观任务 Promise ,那么先执行微观任务,再执行宏观任务。

所以打印的顺序为: 开始111 、开始222 、 promise111 、 promise222 、 setTimeout111 。

你可能感兴趣的:(javascript,js,微观任务,js宏观任务,js循环机制,js,javascript)