《图解 Google V8》事件循环和垃圾回收——学习笔记(三)

这是《图解 Google V8》第三篇/共三篇:事件循环和垃圾回收

这里主要讲了 2 点:

  1. 事件循环:宏任务和微任务
    • 什么是微任务
    • 微任务的执行时机
  2. 垃圾回收
    • 垃圾回收运行过程
    • 垃圾回收算法

通过这个专栏的学习,V8 不在是个陌生的黑盒了,变成了一个熟悉的黑盒,因为这个专栏让你了解了 V8 的大致原理,面试时吹吹牛皮还是可以的,不过也就仅此而已,细节方面还需要自己去深入

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

  • 同步回调函数是在执行函数内部被执行的
  • 异步回调函数是在执行函数外部被执行的

UI 线程是运行窗口的线程,也叫主线程

当鼠标点击了页面,系统会将该事件交给 UI 线程来处理,但是 UI 线程不能立即响应来处理

针对这种情况,浏览器为 UI 线程提供了消息队列,然后 UI 线程会不断的从消息队列中取出事件和执行事件,如果当前没有任何消息等待被处理,那么这个循环就会被挂起

setTimeout

在执行 setTimeout,浏览器会将回调函数封装成一个事件,添加到消息队列中,然后 UI 线程会不间断的从消息队列中取出任务,执行任务,在合适的时机取出 setTimeout 的回调函数

XMLHttpRequest

UI 线程执行 XMLHttpRequest,会阻塞 UI 线程,所以 UI 线程会将它分配给网络线程(是网络进程中的一个线程):

  1. UI 线程从消息队列中取出任务,分析
  2. 发现是一个下载任务,就会交给网络线程去执行
  3. 网络线程接到下载请求后,会和服务器建立联系,发出下载请求
  4. 网络线程不断从服务器接收数据
  5. 网络请求在收到数据后,会将返回的数据和回调函数封装成一个事件,放在消息队列中
  6. UI 线程循环读取消息队列,如果是下载状态的事件,UI 线程就会执行回调函数
  7. 直到下载事件结束,页面显示下载完成

18 | 异步编程(一):V8 是如何实现微任务的?

宏任务是消息队列中等待被主线程执行的事件,每个宏任务在执行的时候都会创建栈,宏任务结束,栈也会被清空

微任务是一个需要异步执行的函数,执行时机是在主函数执行结束之后,当前宏任务结束之前

微任务执行的时机:

  1. 如果当前任务中产生了一个微任务,不会再当前的函数中被执行,所以执行微任务时,不会导致栈的无限扩张
  2. 微任务会在当前任务执行结束之前被执行
  3. 微任务结束执行之前,不会执行其他的任务

参考资料

  1. V8 Promise 源码全面解读
  2. JavaScript Event Loop vs Node JS Event Loop

19 |异步编程(二):V8 是如何实现 async/await 的?

生成器 Generator

带星号的函数配合 yield 可以实现函数的暂停和恢复,这个叫生成器

function* getResult() {
   
  console.log("getUserID before");
  yield "getUserID";
  console.log("getUserName before");
  yield "getUserName";
  console.log("name before");
  return "name";
}

let result = getResult();

console.log(result.next().value);
console.log(result.next().value);
console.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值