17 | 消息队列:V8是怎么实现回调函数的?
该思维导图由 AI 生成,仅供参考
什么是回调函数?
- 深入了解
- 翻译
- 解释
- 总结
V8引擎是JavaScript的运行环境,本文深入探讨了V8是如何实现回调函数的。回调函数是JavaScript中常用的编程模式,通过setTimeout、XMLHTTPRequest等API实现异步操作。文章首先介绍了回调函数的概念和同步、异步回调的区别,然后详细解释了V8的线程架构模型和UI线程的工作原理。通过分析UI线程处理下载事件的流程,阐述了异步回调函数的调用时机。文章深入浅出地解释了V8引擎中回调函数的实现原理,对于理解JavaScript异步编程模型和V8引擎的工作原理具有重要意义。 总结:本文深入探讨了V8引擎中回调函数的实现原理,介绍了同步和异步回调函数的执行流程,以及UI线程的工作原理。通过分析setTimeout和XMLHTTPRequest的执行流程,读者可以更好地理解JavaScript中的异步编程模型和V8引擎的工作原理。 思考题:文章还提出了一个思考题,分析了Node中的readFileSync和readFile函数的执行流程,读者可以在留言区分享讨论。 这篇文章对于想深入了解JavaScript异步编程和V8引擎工作原理的读者来说,是一篇具有启发性的技术文章。
《图解 Google V8》,新⼈⾸单¥59
全部留言(32)
- 最新
- 精选
- 洋洋readFileSync函数执行时会等待文件读取完毕,再执行下一条语句,在该语句后可正常访问其执行结果(获取data); readFile函数执行时不会等待文件读取完毕就会执行下一条语句,如果直接在其后而不是回调函数中操作其执行结果data时,程序会出现报错; 不知道理解有没有偏差,望老师指正!
作者回复: 是的,本质是readFileSync是在主线程上执行的,readFile在读写线程中执行的
2020-04-23420 - 董小聪老师,setTimeout的事件会立即被放进事件队列吗?我的理解是应该先放进一个类似于堆的数据结构然后等到指定的时间到后才放到事件队列的?
作者回复: 不是这样的,在浏览器中这块比较复杂,实际上有另外一个队列用来存放定时器中的回掉事件的,然后还有一个任务调度器,它会从一系列的事件队列中,按照一定规则取出下一个要执行的事件,这个调度策略比较复杂,展开来讲就是一篇文章的内容了。 我觉得你把它看成黑盒就可以了。
2020-04-23912 - -_-|||看文章感觉“UI 线程“就是“主线程“
作者回复: 在浏览器中页面的UI线程就是主线程,在Node中主线程就是主线程 :)
2020-07-0110 - 非洲大地我最凶老师,请问这里的网络线程和网络进程有什么联系呢,文中所说1的网络线程指的是渲染进程里面的异步http请求线程吗
作者回复: Chrome浏览器中比较复杂,下载的是采用了进程。 我在这里只是介绍一个通用的模型,一般都是采用线程的。 其实不管是线程还是进程,大的原理是一样的,都是丢给一个和主线程平行的线程或者进程来处理,处理过程中会动态返回结果给主线程!
2020-04-2328 - 西门吹雪其实也是一样的疑问 settimeout是立即放入消息队列还是等时间到了再放入的?
作者回复: 定时器有单独的队列,每次执行新的宏任务时,主线程会先在这两个队列中查找即将要执行的事件,然后执行
2020-06-1346 - 不二首先要知道浏览器早期的线程机制: 早期其实只有一个ui线程,js的执行也是在ui线程中,那么,鼠标的各种事件,例如鼠标移动事件,每移动一像素就会触发一次事件,很显然,ui线程是无法及时响应和处理这些事件的,所以 “消息队列”的出现就是为了解决这个问题的。 消息队列:即把没执行的事件全部放到了一个队列中,然后ui线程不断轮训这个队列,然后取出新的事件执行,直到队列为空,当前ui线程也会被挂起。 settimeout: 遇到定时器,浏览器会将定时器的回调函数封装成一个事件,进入消息队列,然后在合适的时间点从消息队列中取出该事件,并且执行回调函数。 xmlHttpRequest: 遇到ajax请求时,即执行xmlHttpRequest.send()时, ui线程会将该请求任务转发给网络线程,然后send函数推出,ui线程继续执行,网络线程执行该请求任务,然后将返回的数据和回调函数封装成一个新的事件,并添加到消息队列中。然后ui线程从消息队列中取出事件,并且执行回调函数。
作者回复: 很赞
2020-05-264 - Miracle老师我有个问题,UI线程就是渲染进程里的主线程,那么消息队列里的是 XMLHttpRequest的话,是交给网络进程里的一个网络线程,还是在这个渲染进程里面有一个网络线程?
作者回复: 在目前的Chrome浏览器里面是交给网络进程里面的一个线程来处理的
2020-04-264 - 蔡孟泳有个歧义点,UI线程和主线程,UI 线程提供一个消息队列,并将待执行的事件添加到消息队列中,然后 UI 线程会不断循环地从消息队列中取出事件、执行事件,而对于setTimeout,在时间到了之后,任务被进入消息队列,那这时候文中说是主线程来执行时间。 所以,执行消息队列中的事件是UI线程还是主线程,亦或是主线程即UI线程,感觉文中有点混淆
作者回复: 其实就是一个线程
2020-04-231 - 西门吹雪感谢很有收获
作者回复: :)
2020-06-13 - Geek_177f82老师举的例子是早期单进程浏览器架构,那能否补充下多进程架构以及soa(尤其是这个架构,目前chrome已经采用这个架构了。)架构的例子。
作者回复: 目前chrome正在往这个架构迭代,老架构和新架构并存的状态
2020-04-27