QuickJS 的核心概念和核心 API

1. JSRuntime

  • 定义JSRuntime 是一个 JavaScript 运行时环境,可以看作是一个 JavaScript 虚拟机实例。它提供了执行 JavaScript 代码所需的基础设施和功能,如内存管理、垃圾收集、事件循环等。

  • 作用

    • 提供全局的内存分配和管理功能。
    • 管理多个 JSContext,每个 JSContext 都属于一个 JSRuntime
    • 不同的 JSRuntime 之间是隔离的,不能相互调用和通信。
  • 创建

    cpp 复制代码
    JSRuntime *rt = JS_NewRuntime();
  • 销毁

    cpp 复制代码
    JS_FreeRuntime(rt);

2. JSContext

  • 定义JSContext 是一个 JavaScript 上下文环境,代表一个执行环境或 Realm。每个 JSContext 有自己的全局对象和系统对象。

  • 作用

    • 持有和管理当前运行的 JavaScript 代码的状态和变量。
    • 不同的 JSContext 可以共享对象,类似于浏览器中同源 iframe 之间共享 JavaScript 对象。
    • 一个 JSRuntime 可以有多个 JSContext,它们可以相互访问和共享对象。
  • 创建

    cpp 复制代码
    JSContext *ctx = JS_NewContext(rt);
  • 销毁

    cpp 复制代码
    JS_FreeContext(ctx);

3. 核心 API

  • JS_Eval

    • 作用:执行 JavaScript 脚本。

    • 示例

      cpp 复制代码
      const char *script = "console.log('hello quickjs')";
      JSValue result = JS_Eval(ctx, script, strlen(script), "main", 0);
    • 参数

      • ctx:执行脚本的上下文。
      • script:要运行的 JavaScript 脚本。
      • input_len:脚本长度。
      • filename:脚本文件名(可选)。
      • eval_flags:执行标志(如 JS_EVAL_TYPE_GLOBALJS_EVAL_TYPE_MODULE)。
  • JS_Call

    • 作用:调用 JavaScript 函数。

    • 示例

      cpp 复制代码
      JSValue fun_obj = JS_GetPropertyStr(ctx, global_obj, "myFunction");
      JSValue args[1] = { JS_NewInt32(ctx, 42) };
      JSValue result = JS_Call(ctx, fun_obj, global_obj, 1, args);
  • JS_NewObject

    • 作用:创建一个新的 JavaScript 对象。

    • 示例

      cpp 复制代码
      JSValue obj = JS_NewObject(ctx);
  • JS_SetPropertyStr

    • 作用:设置对象的属性。

    • 示例

      cpp 复制代码
      JS_SetPropertyStr(ctx, obj, "key", JS_NewString(ctx, "value"));
  • JS_GetPropertyStr

    • 作用:获取对象的属性。

    • 示例

      cpp 复制代码
      JSValue value = JS_GetPropertyStr(ctx, obj, "key");

4. 内存管理

  • JS_SetMemoryLimit

    • 作用:设置运行时的内存分配上限。

    • 示例

      cpp 复制代码
      JS_SetMemoryLimit(rt, 1024 * 1024 * 100); // 设置为 100 MB
  • JS_RunGC

    • 作用:运行垃圾回收器。

    • 示例

      cpp 复制代码
      JS_RunGC(ctx);

5. 异常处理

  • JS_GetException
    • 作用:获取异常对象。

    • 示例

      cpp 复制代码
      JSValue exception = JS_GetException(ctx);

6. 模块加载

  • JS_InitModule
    • 作用:初始化模块。

    • 示例

      cpp 复制代码
      JS_InitModule(ctx, "qjs:std");

示例代码

以下是一个完整的示例,展示如何使用 QuickJS 执行一段 JavaScript 脚本:

cpp 复制代码
#include "quickjs.h"

int main() {
    // 创建运行时
    JSRuntime *rt = JS_NewRuntime();
    // 创建上下文
    JSContext *ctx = JS_NewContext(rt);

    // 添加标准模块
    js_std_add_helpers(ctx, 0, NULL);
    js_init_module_std(ctx, "qjs:std");

    // 执行脚本
    const char *script = "console.log('hello quickjs')";
    JSValue result = JS_Eval(ctx, script, strlen(script), "main", 0);

    // 检查异常
    if (JS_IsException(result)) {
        JSValue exception = JS_GetException(ctx);
        printf("Exception: %s\n", JS_ToCString(ctx, exception));
        JS_FreeValue(ctx, exception);
    }

    // 释放资源
    JS_FreeValue(ctx, result);
    JS_FreeContext(ctx);
    JS_FreeRuntime(rt);

    return 0;
}

总结

  • JSRuntime 是整个 JavaScript 执行过程的基础,提供内存管理和垃圾回收等功能。
  • JSContext 是 JavaScript 代码执行的具体环境,每个上下文有自己的全局对象和系统对象。
  • 核心 API 提供了执行脚本、调用函数、创建对象、设置和获取属性等功能。
  • 内存管理异常处理 是运行时的重要组成部分,确保代码的稳定运行。
相关推荐
mit6.8243 分钟前
并查集|栈
c++
中国胖子风清扬8 分钟前
Rust 序列化技术全解析:从基础到实战
开发语言·c++·spring boot·vscode·后端·中间件·rust
二川bro42 分钟前
第25节:VR基础与WebXR API入门
前端·3d·vr·threejs
上单带刀不带妹1 小时前
Node.js 的模块化规范是什么?CommonJS 和 ES6 模块有什么区别?
前端·node.js·es6·模块化
缘如风1 小时前
easyui 获取自定义的属性
前端·javascript·easyui
诗书画唱1 小时前
【前端教程】JavaScript 实现图片鼠标悬停切换效果与==和=的区别
开发语言·前端·javascript
光影少年1 小时前
前端上传切片优化以及实现
前端·javascript·掘金·金石计划
岁忧1 小时前
(LeetCode 面试经典 150 题) 200. 岛屿数量(深度优先搜索dfs || 广度优先搜索bfs)
java·c++·leetcode·面试·go·深度优先
一枝小雨1 小时前
【OJ】C++ vector类OJ题
数据结构·c++·算法·leetcode·oj题
喜葵1 小时前
前端安全防护深度实践:从XSS到供应链攻击的全面防御
前端·安全·xss