Java ScriptEngine (nashorn & rhino): как складывать области/привязки?

Мне нужно перенести программное обеспечение с помощью Rhino1.7R4 и его пакета org.mozilla.javascript, чтобы использовать пакет javax.script и его ScriptEngine ( Rhino в Java 6 и 7, Nashorn в Java 8).

Основная проблема заключается в том, чтобы складывать области видимости (привязки). Используя банку Rhino, я делаю:

Scriptable scope ...
Scriptable newScope = javascriptContext.initStandardObjects();
newScope.setParentScope(scope);

So

  • если переменная определена без var, это глобальная переменная (корневая область)
  • если переменная определена с помощью var, это локальная переменная (текущая область)
  • если к переменной обращаются или изменяют, поиск движка в ее текущей области, а также в родительском и прародительском... и в глобальной области

Это стандартное поведение JS.

Как я могу сделать то же самое, что и setParentScope с API javax.script?


person Nicolas Albert    schedule 29.01.2015    source источник


Ответы (1)


Ни одна из javax.script.Bindings реализаций, которые я могу найти в своем JDK, не имеет рекурсивного поиска. Я думаю, что ваш единственный вариант - написать собственную реализацию Bindings, которая может вернуться к родительской Bindings.

Изменить: только под Nashorn (не Rhino, извините), я думаю, что jdk.nashorn.api.scripting.ScriptObjectMirror может быть более способным, поскольку у него есть setProto() для изменения объекта-прототипа. Подробнее о ScriptObjectMirror здесь: https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes

person seanf    schedule 06.03.2015
comment
API недостаточно. Неизвестно, является ли присвоение значения переменной глобальным или локальным (с ключевым словом var для его оператора или без него). - person Nicolas Albert; 06.03.2015