老师您好,想问下关于 v8 和 event loop 以及 web api 的关系

来源:9-4 DOM节点操作

Osuribaba

2020-12-25

我理解 v8 是 js 的解释器,相当于说给 v8 输入一串符合 js 语法的字符串,然后它就能进行解释。对于输入的那串字符串可能后边会生成语法树或者中间代码之类的,如果在语法树或者中间代码中碰到类似 setTimetout,XHLHttpRequest dom 事件等不属于 v8 原生支持的方法,就把这些东西抛给对应的 定时器线程,IO线程 等,所以我想问下,对于 setTimeout 或者 nodejs 中的 nextTick 之类的这种不属于 v8 原生的东西,v8 是怎么知道要把对应的方法抛给对应的线程或者处理器的呢?或者说,浏览器这个环境或者 nodejs 这个环境,是怎么样让 v8 感知到 某个 Api 是我这个执行环境或者说宿主注入给你 v8 的?是 v8 引擎提供了什么用于拓展的接口么?
还有 event loop 的代码运行在哪里呢?我理解渲染进程里头有好多线程,比如 解析 js 的线程,处理 IO 的线程,处理定时器的线程,用 GPU 渲染页面的线程等,我觉得是否应该还有条线程用来运行 event loop 的代码,然后这条线程会不停地循环 js 解析线程的栈区,发现一旦 js 解析线程中的栈是空了就说明同步代码执行完,这个时候这条跑 eventloop 的线程就会去事件队列里头拿出 从别的线程发送过来的回调任务 出来执行?我不知道我这个理解是否是对的,所以请教老师一下。
然后还有,由于浏览器的 event loop 和 nodejs 的 event loop 还不一样,所以我理解 event loop 是不是也是 v8 引擎暴露给宿主环境的一个拓展接口?就比如 “我是 v8,我给你们宿主,提供了一个接口,你们按照我这个接口的规范,去在你们自己环境里头,去实现一个 event loop,你们的 event loop 要有什么什么样的 api 或者 什么什么样的功能,你们按照我的规范实现了这些功能的话,等我再解析 js 时候碰到什么微任务之类的,我就能发送给你们了,你们也能把宏任务或者微任务送到我这儿解析了”。不知道我这么理解对不对?
谢谢老师~

写回答

1回答

双越

2020-12-25

一次性提问太多,这样我不方便解答,你也不方便再次回复。

所以,我建议你重新提交问题,每次只提一个问题,我们搞定之后再说下一个问题。


你想一次性、短时间搞懂所有问题,这不太现实。

一步一步来。

0
2
Osuribaba
好的,我已经分成三个问题了,麻烦老师看一下
2020-12-25
共2条回复

一天时间高效准备前端技术一面 匹配大厂面试要求

针对时下面试高频考点,帮助新人js面试快速通关

4694 学习 · 1681 问题

查看课程