JS事件循环机制EVENLOOP

前言

	首先,JavaScript是一门单线程的非阻塞的脚本语言:用来与浏览器交互。
	单线程:在执行代码时,只有一个主线程来处理所有任务。
	非阻塞:当代码进行异步任务(需要耗费时间才能返回的任务)时,主线程会挂起这个任务,
然后在异步任务返回结果时再执行相应的回调。

.
那么JavaScript是怎么实现非阻塞的呢——event loop (事件循环)。

执行栈和事件队列

同步代码:
当我们调用方法时,js会生成与之对应的执行环境(context),当一系列方法被依次调用时,其他方法会被排队在一个叫“执行栈”的地方;当这个执行环境中的代码执行完毕并返回结果后,js会退出执行环境并销毁,回到上个执行环境。反复进行直到代码全部执行完毕。

异步代码
JavaScript遇到一个异步事件后,不将这个事件挂起,继续执行其他同步代码,当异步事件返回结果时,JS会将他加入另一个队列——(事件队列)。等执行栈的所有任务执行完毕,主线程处于闲置的时候,主线程会去查找事件队列是否有任务。如果有,取第一个事件放入执行栈中,执行其中的同步代码。
而异步任务之间并不相同,他们的执行优先级有区别。不同的异步任务会被分为两类:微任务(micro task)和宏任务(macro task).
宏任务:setInterval(),setTimeout().
微任务:new promise(),new MutaionObserver();
主线程空闲的时候会先去查看微任务队列是否有事件存在,如果存在就会一次对微任务队列依次调用,直到为空。然后其宏任务队列依次执行,进入循环。
微任务永远在宏任务之前执行。
JS事件循环机制EVENLOOP_第1张图片

你可能感兴趣的:(全力攻击JS,js,js事件循环,EVENLOOP)