图解 Google V8
李兵
前盛大创新院高级研究员
立即订阅
3123 人已学习
课程目录
已完结 24 讲
0/4登录后,你可以任选4讲全文学习。
宏观视角 (2讲)
开篇词 | 如何学习谷歌高性能 JavaScript 引擎V8?
免费
01 | V8是如何执行一段JavaScript代码的?
JavaScript设计思想篇 (7讲)
02 | 函数即对象:一篇文章彻底搞懂JavaScript的函数特点
03 | 快属性和慢属性:V8是怎样提升对象属性访问速度的?
04 | 函数表达式:涉及大量概念,函数表达式到底该怎么学?
05|原型链:V8是如何实现对象继承的?
06|作用域链:V8是如何查找变量的?
07|类型转换:V8是怎么实现1+“2”的?
08|答疑:如何构建和使用V8的调试工具d8?
V8编译流水线 (8讲)
09 | 运行时环境:运行JavaScript代码的基石
10 | 机器代码:二进制机器码究竟是如何被CPU执行的?
11 | 堆和栈:函数调用是如何影响到内存布局的?
12 | 延迟解析:V8是如何实现闭包的?
13 | 字节码(一):V8为什么又重新引入字节码?
14|字节码(二):解释器是如何解释执行字节码的?
15 | 隐藏类:如何在内存中快速查找对象属性?
16 | 答疑: V8是怎么通过内联缓存来提升函数执行效率的?
事件循环和垃圾回收 (6讲)
17 | 消息队列:V8是怎么实现回调函数的?
18 | 异步编程(一):V8是如何实现微任务的?
19|异步编程(二):V8是如何实现async/await的?
20 | 垃圾回收(一):V8的两个垃圾回收器是如何工作的?
21 | 垃圾回收(二):V8是如何优化垃圾回收器执行效率的?
22|答疑:几种常见内存问题的解决策略
结束语 (1讲)
结束语 | 我的前端学习踩坑史
图解 Google V8
15
15
1.0x
00:00/00:00
登录|注册

17 | 消息队列:V8是怎么实现回调函数的?

李兵 2020-04-23
你好,我是李兵。
我们在使用 JavaScript 时,经常要用到大量的回调函数,比如在浏览器中可以使用 setTimeout 来设置定时器,使用 XMLHTTPRequest 来异步下载资源文件,在 Node 中可以使用 readFile 来读取文件,这些操作都有一个共同的特点,那就是需要给调用 API 传入回调函数,然后浏览器或者 Node 会将执行处理的结果通过回调函数来触发。
从内部了解回调函数,可以帮助我们梳理清楚很多问题:
有助于我们理解浏览器中的 Web API 到底是怎么工作的;
有助于我们理解宏任务和微任务到底有哪些区别;
理解回调函数,是理解异步编程模型 async/await 的基础。
这些内容在我们实际的项目中都会频繁使用到,所以理解 V8 是怎么实现回调函数的就显得至关重要了。

什么是回调函数?

那究竟什么是回调函数呢?其实回调函数也是个函数,就像白马也是马一样。它具有函数的所有特征,它可以有参数和返回值。如果单独给出一个函数,你是看不出来它是不是回调函数的。回调函数区别于普通函数,在于它的调用方式。只有当某个函数被作为参数,传递给另外一个函数,或者传递给宿主环境,然后该函数在函数内部或者在宿主环境中被调用,我们才称为回调函数。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《图解 Google V8》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(8)

  • 董小聪
    老师,setTimeout的事件会立即被放进事件队列吗?我的理解是应该先放进一个类似于堆的数据结构然后等到指定的时间到后才放到事件队列的?

    作者回复: 不是这样的,在浏览器中这块比较复杂,实际上有另外一个队列用来存放定时器中的回掉事件的,然后还有一个任务调度器,它会从一系列的事件队列中,按照一定规则取出下一个要执行的事件,这个调度策略比较复杂,展开来讲就是一篇文章的内容了。

    我觉得你把它看成黑盒就可以了。

    2020-04-23
    3
    2
  • haijian.yang
    Node.js 的文件操作用的是 Libuv 线程池里的线程。
    2020-04-23
    2
  • 非洲大地我最凶
    老师,请问这里的网络线程和网络进程有什么联系呢,文中所说1的网络线程指的是渲染进程里面的异步http请求线程吗

    作者回复: Chrome浏览器中比较复杂,下载的是采用了进程。

    我在这里只是介绍一个通用的模型,一般都是采用线程的。

    其实不管是线程还是进程,大的原理是一样的,都是丢给一个和主线程平行的线程或者进程来处理,处理过程中会动态返回结果给主线程!

    2020-04-23
    2
  • 蔡孟泳
    有个歧义点,UI线程和主线程,UI 线程提供一个消息队列,并将待执行的事件添加到消息队列中,然后 UI 线程会不断循环地从消息队列中取出事件、执行事件,而对于setTimeout,在时间到了之后,任务被进入消息队列,那这时候文中说是主线程来执行时间。 所以,执行消息队列中的事件是UI线程还是主线程,亦或是主线程即UI线程,感觉文中有点混淆

    作者回复: 其实就是一个线程

    2020-04-23
    1
  • Geek_177f82
    老师举的例子是早期单进程浏览器架构,那能否补充下多进程架构以及soa(尤其是这个架构,目前chrome已经采用这个架构了。)架构的例子。
    2020-04-27
  • Miracle
    老师我有个问题,UI线程就是渲染进程里的主线程,那么消息队列里的是 XMLHttpRequest的话,是交给网络进程里的一个网络线程,还是在这个渲染进程里面有一个网络线程?
    2020-04-26
  • 林克的小披风
    主线程就是UI线程吗
    2020-04-23
    1
  • 洋洋
    readFileSync函数执行时会等待文件读取完毕,再执行下一条语句,在该语句后可正常访问其执行结果(获取data);
    readFile函数执行时不会等待文件读取完毕就会执行下一条语句,如果直接在其后而不是回调函数中操作其执行结果data时,程序会出现报错;
    不知道理解有没有偏差,望老师指正!
    2020-04-23
收起评论
8
返回
顶部