YStudio Y++

JS类

Y++ / YStudio 开发文档 · 一点滴

嵌入式 JavaScript 引擎(quickjs-ng)。类型名必须写 JS类(不要写 JS)。

适合:签名算法、数据变换、厂商给的 JS 片段。
没有 浏览器 DOM / fetch / 本地文件 API。


1. 快速开始

JS类 eng

如果 (eng.执行(R"js(
function add(a, b) { return a + b; }
var modern_nullish = "ok";
)js") == 假) {
    输出(eng.取错误())
    返回()
}

文本 sum = eng.调用("add", "[1,2]")     ' 参数必须是 JSON 数组文本
输出(sum)                               ' 3
输出(eng.取全局("modern_nullish"))      ' ok

从文件加载:

eng.加载("sign.js")   ' UTF-8

2. 常用方法

方法 说明
执行(脚本) 执行一段 JS;失败返回假
加载(路径) 读 UTF-8 .js 再执行
置全局(名, 值文本) 写入全局属性(值为 JS 表达式/JSON 文本,以实现为准)
取全局(名) 读全局属性为文本
调用(函数名, [参数JSON数组]) 调用全局函数;第二参如 "[1,2]""[\"hello\",1]"
取错误 最近错误
重置 清空引擎状态

3. 写法要点

  • 复杂脚本推荐原始字符串:R"js( ... )js",避免转义地狱。
  • 调用 的第二参必须是 JSON 数组文本(不是逗号分隔的裸参数列表)。
  • 要用 取全局 看到的名字,请用 varglobalThis.xxx = ...。顶层 const / let 不会挂到全局对象上。
  • 每个 JS类 变量是独立引擎,互不影响。
  • 失败时方法返回假或空文本,用 取错误 排查。

4. 与 HTTP / JSON 联用

JS类 js
JSON类 req
HTTP类 http

js.执行(R"js(
function getSign(s, ts) { return "sig_" + s.length + "_" + ts; }
)js")

文本 sign = js.调用("getSign", "[\"hello\",1700000000]")
req.置为空对象()
req.置文本("sign", sign)
http.置请求头("Content-Type", "application/json")
文本 resp = http.提交("POST", url, req.到文本())