動態 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 與參照指派,沿用與呼叫事件相同的明確 handle 與一般值複製規則

每個評估的計算式都有自己的變數與函式,讀不到呼叫方計算式宣告的變數或函式

目前欄位、相對表單物件、$form、$host 與 $event 仍然可用;Eval(null) 回傳 null,其他 scalar 參數則變成 source 文字

在 SOM 述詞內,候選項提供目前的欄位或 subform context,巢狀 Eval 繼承該 context

例如沒有名為 secret 的表單物件時,var secret=9 Eval("secret+1") 會失敗,而 Eval("var secret=2 secret+1") 回傳 3

交易與重播

source 第一次使用時會暫停執行,讓原生編譯器產出對應的 JavaScript;宿主還原事件前的 script 狀態、提供編譯回應,再重試該計算式

重試時會消費已錄製的 transport 與 locale 回應,因此巢狀編譯不會重複觸發外部 transport callback

只有最終成功的評估會進入 script journal;語法錯誤、執行期錯誤與預算失敗會透過 runtime 交易還原欄位值、instance 狀態與 script 狀態

Eval 也可以在實際的計算欄位與驗證 script 內使用;SaveToBytes 會保留已提交的文件值

預算

每個事件最多允許 64 個相異動態 source、八層巢狀 Eval 呼叫,以及動態 source 加編譯回應位元組合計 2 MiB;這些界限與設定的 script 輸入、操作、記憶體、堆疊、journal 與耗時限制並行生效

設定的堆疊或耗時限制可能先於專屬的巢狀或請求界限觸發失敗;編譯重試共用事件期限

自訂的 JavaScript evaluator 無法服務原生動態編譯請求;請使用隨附的 QuickJS 執行路徑

相關 API

HPDFXFACompileFormCalcEvent、HPDFXFAExecuteJavaScriptEvent、FormCalc 函式與互動式 XFA Runtime