1. JSRuntime
-
定义 :
JSRuntime
是一个 JavaScript 运行时环境,可以看作是一个 JavaScript 虚拟机实例。它提供了执行 JavaScript 代码所需的基础设施和功能,如内存管理、垃圾收集、事件循环等。 -
作用 :
- 提供全局的内存分配和管理功能。
- 管理多个
JSContext
,每个JSContext
都属于一个JSRuntime
。 - 不同的
JSRuntime
之间是隔离的,不能相互调用和通信。
-
创建 :
cppJSRuntime *rt = JS_NewRuntime();
-
销毁 :
cppJS_FreeRuntime(rt);
2. JSContext
-
定义 :
JSContext
是一个 JavaScript 上下文环境,代表一个执行环境或 Realm。每个JSContext
有自己的全局对象和系统对象。 -
作用 :
- 持有和管理当前运行的 JavaScript 代码的状态和变量。
- 不同的
JSContext
可以共享对象,类似于浏览器中同源 iframe 之间共享 JavaScript 对象。 - 一个
JSRuntime
可以有多个JSContext
,它们可以相互访问和共享对象。
-
创建 :
cppJSContext *ctx = JS_NewContext(rt);
-
销毁 :
cppJS_FreeContext(ctx);
3. 核心 API
-
JS_Eval:
-
作用:执行 JavaScript 脚本。
-
示例 :
cppconst 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_GLOBAL
或JS_EVAL_TYPE_MODULE
)。
-
-
JS_Call:
-
作用:调用 JavaScript 函数。
-
示例 :
cppJSValue 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 对象。
-
示例 :
cppJSValue obj = JS_NewObject(ctx);
-
-
JS_SetPropertyStr:
-
作用:设置对象的属性。
-
示例 :
cppJS_SetPropertyStr(ctx, obj, "key", JS_NewString(ctx, "value"));
-
-
JS_GetPropertyStr:
-
作用:获取对象的属性。
-
示例 :
cppJSValue value = JS_GetPropertyStr(ctx, obj, "key");
-
4. 内存管理
-
JS_SetMemoryLimit:
-
作用:设置运行时的内存分配上限。
-
示例 :
cppJS_SetMemoryLimit(rt, 1024 * 1024 * 100); // 设置为 100 MB
-
-
JS_RunGC:
-
作用:运行垃圾回收器。
-
示例 :
cppJS_RunGC(ctx);
-
5. 异常处理
- JS_GetException :
-
作用:获取异常对象。
-
示例 :
cppJSValue exception = JS_GetException(ctx);
-
6. 模块加载
- JS_InitModule :
-
作用:初始化模块。
-
示例 :
cppJS_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 提供了执行脚本、调用函数、创建对象、设置和获取属性等功能。
- 内存管理 和 异常处理 是运行时的重要组成部分,确保代码的稳定运行。