其他分享
首页 > 其他分享> > 事件循环

事件循环

作者:互联网

事件循环机制

随手整一下事件循环,趁着现在脑子清醒(new和原型链还没有整理)   具体道理我都懂,只是我想知道的是,是谁把那些异步的东东在什么时间加进去的? 这个看了MDN和阮一峰也没有详细说明,倒不是说像new那样错了的问题了就是他们都仔细没说哈哈哈 看这里!https://juejin.cn/post/6844903968292749319 非常不错,仅此一家!      · 主线程:也就是 js 引擎执行的线程,这个线程只有一个,页面渲染、函数处理都在这个主线程上执行。    · 工作线程:也称幕后线程,这个线程可能存在于浏览器或js引擎内,与主线程是分开的,处理文件读取、网络请求等异步事件。   主线程在执行栈里执行同步代码,而异步的? 实际上这些异步的操作,是有一个“幕后线程”来执行的,也是它, 在 『ajax得到回复、 settimeout  时间轮到 』的时候加入任务队列。 任务队列优先极是因为有宏任务和微任务两个管道,不是因为自动排序。 宏任务就已经是task queue了,或者Macrotask ,微任务是microtask。   但实际上真的是因为先去宏任务再微任务吗?不是的…… 还是 看那篇文章: 简而言之,一次事件循环只执行处于 Macrotask 队首的任务,执行完成后,立即执行 Microtask 队列中的所有任务。(如果微任务在当前队列有新增的,也是继续执行微任务的) 原因:因为一开始js主线程中跑的任务就是macrotask任务,而根据事件循环的流程,一次事件循环只会执行一个macrotask任务,因此,执行完主线程的代码后,它就去从microtask队列里取队首任务来执行。   这个,一般人可能都没太注意到,因为表现出来是优先极,但实际去看的话,嗯…… https://www.cnblogs.com/wonyun/p/11510848.html 这里也说了,确实是一个宏任务--> 所有微任务 --》UI渲染. 这篇就讲的很深了,而且涉及到了vue的nextTick机制   其中script(整体代码)是算作一个宏任务的 注意: 由于在执行microtask任务的时候,只有当microtask队列为空的时候,它才会进入下一个事件循环,因此,如果它源源不断地产生新的microtask任务,就会导致主线程一直在执行microtask任务,而没有办法执行macrotask任务,这样我们就无法进行UI渲染/IO操作/ajax请求了,因此,我们应该避免这种情况发生。在nodejs里的process.nexttick里,就可以设置最大的调用次数,以此来防止阻塞主线程。   虽然 V8 是单线程的,但底层的 C++ API 却不是。这意味着当我们执行一些非阻塞的操作,Node会调用一些代码,与引擎里的js代码同时执行。一旦这个隐藏的线程收到了等待的返回值或者抛出一个异常,之前提供的回调函数就会执行。   在主线程执行栈空闲的情况下,从任务队列中读取任务入执行栈执行,这个过程是循环不断进行的,所以又称Event loop(事件循环)  

(顺带一提,有关浏览器。。)

浏览器内核即浏览器底层最核心和最基础的那一部分,它主要负责对网页当中的html、css、JavaScript进行解释然后在浏览器当中进行渲染最终呈现给用户,也就是说内核的工作就是渲染

整个浏览器是多进程的,平时我们经常接触的是JS引擎和渲染引擎都是属于单个进程(单个tab页)的一个线程。
那么js引擎是单线程的~ 渲染引擎~还有异步引擎和定时器引擎
但是处理还是js引擎在做,只是说等待事件返回是别的线程去处理的。所以事件循环和引擎这几个关系不大~

标签:microtask,js,任务,引擎,线程,事件,执行,循环
来源: https://www.cnblogs.com/lx2331/p/15218363.html