Динамический FormCalc Eval
Eval(source) компилирует динамически переданное вычисление нативным компилятором FormCalc и выполняет его через общий хост событий, когда включён EnableJavaScript
Исходник может содержать выражения, условные конструкции, циклы, объявления переменных, локально объявленные функции и мутации полей; результат — последнее выражение, а встроенные имена нечувствительны к регистру
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 наследует этот контекст
Например, var secret=9 Eval("secret+1") падает, когда нет объекта формы с именем secret, а Eval("var secret=2 secret+1") возвращает 3
Транзакции и повтор
Первое использование исходника приостанавливает выполнение, чтобы нативный компилятор выдал свой JavaScript; хост восстанавливает состояние скрипта до события, передаёт скомпилированный ответ и повторяет вычисление
Записанные ответы транспорта и локали потребляются при повторе, поэтому вложенная компиляция не повторяет внешние callback транспорта
В журнал скриптов попадает только финальное успешное вычисление; синтаксические и runtime-ошибки и сбои бюджета восстанавливают значения полей, состояние экземпляров и состояние скрипта через транзакцию runtime
Eval работает и внутри реальных вычисляемых полей и скриптов валидации; SaveToBytes сохраняет зафиксированные значения документа
Бюджеты
Каждое событие допускает не более 64 различных динамических исходников, восьми вложенных вызовов Eval и 2 МиБ суммарных динамических исходников плюс байтов скомпилированных ответов; эти границы действуют вместе с настроенными лимитами скриптового ввода, операций, памяти, стека, журнала и времени
Настроенный лимит стека или времени может сработать раньше выделенных границ вложенности или запросов; повторы компиляции делят дедлайн события
Пользовательский вычислитель JavaScript не может обслуживать запросы нативной динамической компиляции; используйте поставляемый путь выполнения QuickJS
Связанные API
HPDFXFACompileFormCalcEvent, HPDFXFAExecuteJavaScriptEvent, Функции FormCalc и Интерактивный XFA runtime