从 QuickJS 源码理解 JavaScript 的闭包

摘要

本文从 QuickJS 源码的角度分析 JavaScript 语言中的闭包的实现原理,首先介绍闭包的概念,然后从相关 C 语言代码,一步步解析闭包以及相关的垃圾回收机制的底层实现,最后总结闭包的定义和相关原理。

QuickJS 是一个用 C 语言编写的小型 JavaScript 引擎,支持 ES2019 规范,之所以选择 QuickJS 作为本文的解析对象,是因为它的源代码源码是由 C 语言编写的,仅由几个 C 文件组成,没有那么多复杂难懂的语法,也没有任何外部依赖,阅读难度较低。

注意,这不是一篇详细解析 QuickJS 源码的文章,作者仅对闭包相关的源码做了简单的解析,部分内容是在未完全理解 QuickJS 全部功能和工作原理的情况下而撰写的,某些概念和工作原理只适用于 QuickJS,可能具有误导性,请谨慎理解。

造一个简单的浏览器

前言

本教程将通过一个简单的仿浏览器界面的程序,向你介绍关于构建图形界面程序的基础知识,掌握这些知识后,你将会对图形界面开发有更加深刻的理解。

Trad 0.2.0 开发日志

开发计划:

  • 参考 babel 的架构,重写编译器及相关模块
  • 重写 LCUI 的绑定

LCUI 2.0.0 开发日志

开发计划:

  • 重写布局系统,完善对 Flex 布局支持。
  • 改进部件的更新流程,只需遍历一次部件树就能完成所有部件的更新。
  • 优化部件的无效区域收集性能。

盒阴影的绘制方法

需求

LCUI 现有的阴影绘制方法只适合直角边框,没有考虑到圆角的情况,在添加 LCUI 的圆角绘制功能后,阴影绘制功能也需要重写。

LCUI Router 0.1.0 开发日志

一个应用的图形界面通常会包含很多个视图,视图切换和导航是很常用的功能,然而在 LCUI 中实现这些功能却非常麻烦,考虑到这些问题,需要一个像 Vue Router 的路由解决方案,主要功能下:

LC Design 1.0.0 开发日志

准备给 LCUI.css 加一些组件,首先得改用新名字,Ant Design 宣称它是一套企业级设计语言,那么名字就命名为 LC Design,一套适用于 LCUI 的设计风格的组件库。

Spinner 动画的绘制方法

在 LCUI 中想在界面上表示“加载中”状态挺麻烦的,为此准备给 LC Design 组件库添加 Spinner 组件,效果和 Bootstrap 的同名组件一致。