Java ScriptEngine(nashorn& rhino):如何堆叠范围/绑定?

时间:2015-01-29 10:18:19

标签: java rhino nashorn scriptengine javax.script

我必须使用 Rhino1.7R4 及其 org.mozilla.javascript 包移植软件才能使用 javax.script 包它的ScriptEngine(Java 6中的 Rhino ,Java 8中的 Nashorn )。

主要问题是堆栈范围(Bindings)。 使用犀牛罐,我做:

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

所以

  • 如果定义的变量没有var,则它是全局变量(根范围)
  • 如果使用var定义变量,则它是局部变量(当前范围)
  • 如果访问或修改变量,则在其当前范围内进行引擎查找,以及父级和祖父级...以及全局范围

这是JS的标准行为。

如何使用javax.script API执行与 setParentScope 相同的操作?

1 个答案:

答案 0 :(得分:1)

我在JDK中找到的javax.script.Bindings实现都没有任何类型的递归查找。我认为您唯一的选择就是编写一个自定义Bindings实现,该实现可以回退到父Bindings

编辑:仅在Nashorn下(不是Rhino,对不起),我认为jdk.nashorn.api.scripting.ScriptObjectMirror可能更有能力,因为它有setProto()来更改原型对象。有关ScriptObjectMirror的更多信息,请访问:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes