动态 FormCalc Eval
Eval(source) 用原生 FormCalc 编译器编译动态提供的计算,并在 EnableJavaScript 启用时经通用事件宿主执行
source 可包含表达式、条件、循环、变量声明、本地声明的函数与字段变更;最后一个表达式是结果,内建名称不区分大小写
var source = "target + other"
target = Eval(source)
target = Eval("var n=2 for i=1 upto 4 do n=n*i endfor n")
作用域与对象
Ref 与引用赋值在求值计算内部可用,使用与调用事件相同的显式句柄和普通值拷贝规则
每个求值计算有自己的变量与函数;不能读取调用方计算声明的变量或函数
当前字段、相对表单对象、$form、$host 与 $event 仍然可用;Eval(null) 返回 null,其他标量参数转为源文本
SOM 谓词内部,候选对象提供当前字段或 subform 上下文,嵌套 Eval 继承该上下文
例如,不存在名为 secret 的表单对象时 var secret=9 Eval("secret+1") 失败,而 Eval("var secret=2 secret+1") 返回 3
事务与重放
source 首次使用会挂起执行,让原生编译器产出对应 JavaScript;宿主恢复事件前脚本状态、提供编译响应并重试计算
重试期间消费已记录的 transport 与 locale 响应,嵌套编译不会重复外部 transport Callback
只有最终成功的求值进入脚本日志;语法错误、运行时错误与预算失败通过运行时事务还原字段值、实例状态与脚本状态
Eval 也可用于真实的计算字段与校验脚本内部;SaveToBytes 保留已提交的文档值
预算
每个事件最多允许 64 个不同动态 source、八层嵌套 Eval 调用以及动态 source 加编译响应合计 2 MiB;这些界限与配置的脚本输入、操作、内存、栈、日志与耗时限制并行生效
配置的栈或耗时限制可能先于专用嵌套或请求上限触发失败;编译重试共享事件截止时间
自定义 JavaScript evaluator 无法服务原生动态编译请求;请使用随库的 QuickJS 执行路径
相关 API
HPDFXFACompileFormCalcEvent, HPDFXFAExecuteJavaScriptEvent, FormCalc 函数和 交互式 XFA 运行时