0%

js 的 Event Loop

JavaScript 的运行机制:

EventLoop:

至于哪些是宏操作哪些是微操作:

  • macro-task(宏任务):包括整体代码script,setTimeout,setInterval, setImmediate(node环境下)。
  • micro-task(微任务):Promise,process.nextTick

也就是说,从代码开始执行,就先创建一个宏操作,相当于是对代码的整体编译,然后每遇到一个宏操作或者微操作,都会将其放到对应的位置去,比如宏操作会放到主执行栈, 微操作会放到Event Queue 中.然后当代码”编译”执行完,也就是主执行栈执行完成,这个时候就会去执行 Event Queue, 也就是刚刚代码中的 Promise 或者 process.nextTick. 例如这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
console.log('script start');

setTimeout(function() {
console.log('timeout1');
}, 10);

new Promise(resolve => {
console.log('promise1');
resolve();
setTimeout(() => console.log('timeout2'), 10);
}).then(function() {
console.log('then1')
})

console.log('script end');

//执行结果为script start, promise1, script end, then1, timeout1, timeout2

如果一开始不熟练的话可以画出两个队列,分别把要执行的程序排进去