在看到面试的时候的高频问题,今天我们就来深入的了解事件循环机制,因为之前总是看到,总是会忘记,今天就认真的总结出一篇专栏。
Js是单线程的解释性语言,在执行任务的过程中。但是在执行任务的时候会有同步任务
和异步任务
之分。
- 所有的同步任务会在主线程上先执行。
- 并且异步的任务会被放在
even table
中被注册,注册之后会函数被移入到event queue
- 当主线程完成完毕之后,会把event queue里读取对应的函数进入主线程进行执行。
- 上述过程不断重复就是常说的事件循环机制。
如果又有异步的事件,会继续分发到对应的队列中,继续执行。其中就出现了宏任务
和微任务
的区分。但是我自己的理解是,宏任务
和微任务
的交替才构成了事件循环。
下文是从网上一篇文章中摘录的例子,看到评论区对于一些细节的争执,本着实践出真知的原则,我去拿来实践了一下。
原文链接:https://www.jianshu.com/p/12b9f73c5a4f/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| console.log('golb1');
setTimeout(function() { console.log('timeout1'); process.nextTick(function(){ console.log('timeout1_nextTick'); }) new Promise(function(resolve) { console.log('timeout1_promise'); resolve(); }).then(function() { console.log('timeout1_then') }) })
setImmediate(function() { console.log('immediate1'); process.nextTick(function() { console.log('immediate1_nextTick'); }) new Promise(function(resolve) { console.log('immediate1_promise'); resolve(); }).then(function() { console.log('immediate1_then') }) })
process.nextTick(function() { console.log('glob1_nextTick'); }) new Promise(function(resolve) { console.log('glob1_promise'); resolve(); }).then(function() { console.log('glob1_then') })
setTimeout(function() { console.log('timeout2'); process.nextTick(function() { console.log('timeout2_nextTick'); }) new Promise(function(resolve) { console.log('timeout2_promise'); resolve(); }).then(function() { console.log('timeout2_then') }) })
process.nextTick(function() { console.log('glob2_nextTick'); }) new Promise(function(resolve) { console.log('glob2_promise'); resolve(); }).then(function() { console.log('glob2_then') })
setImmediate(function() { console.log('immediate2'); process.nextTick(function() { console.log('immediate2_nextTick'); }) new Promise(function(resolve) { console.log('immediate2_promise'); resolve(); }).then(function() { console.log('immediate2_then') }) })
|
下面给一个链接,链接里的图画的比较符合实际:
https://www.cnblogs.com/amiezhang/p/11349450.html