eventLoop机制

1.js为单线程

假设js有两个线程,一个在某个dom添加内容,另一个在这个dom删除内容,浏览器应该以哪个线程为准?
这就意味着,单线程为js核心标准,将一直沿用下去。

web worker : 号称让js成为一门多线程语言
所有新线程受主线程的控制,不能独立执行。实际上属于主线程的子线程。
子线程没有执行I/O操作的权限,只能为主线程分担计算等任务,严格说,这些线程没有完整功能,并非改变了js的单线程本质。

2.事件循环

一直在查找新的事件执行,一次执行的循环成为tick,循环里执行的代码称为task

任务分同步和异步
js执行时将不同变量存在内存的不同位置:堆(heap)和栈(stack)中区分。
堆中一般存变量,stack一般存函数和方法。
stack叫做执行栈,方法会依次在这里执行。
执行栈事件先进先出,任务队列先进先出。
web apis代表异步事件,callback queue事件队列

执行栈执行主线程任务,当有操作dom,ajax交互,定时器 等异步操作时候,任务会移入到callback queue任务队列
当主线程执行完毕后,读取callbakc quene队列中的函数,进入主线程执行。
不断重复,就是常说的事件循环(eventloop)

3.macro task和 micro task

不同的异步任务会分为两类:微任务(micro)和宏任务(macro)

在一个事件循环中,异步事件返回结果后被放到对应的宏任务队列或者微任务队列中去。

宏任务->这个宏任务中的微任务->下一个宏任务->下一个宏任务添加的微任务

当执行栈为空时,主线程会首先查看微任务中的事件,如果微任务不是空执行微任务。如果没有任务,在宏任务中取出最前面的一个事件,把对应的回调加入当前执行栈......... 如此反复,进入循环

macro-task(宏任务)
整体代码
settimeout
setinterval
setlmmediate

主代码块 > setImmediate > MessageChannel > setTimeout / setInterval

micro-task(微任务)

process.nextTick > Promise > MutationObserver

你可能感兴趣的:(eventLoop机制)