2

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

主要问题是堆栈范围(绑定)。使用 Rhino jar,我这样做:

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

所以

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

这是 JS 标准行为。

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

4

1 回答 1

1

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

编辑:仅在 Nashorn 下(不是 Rhino,抱歉),我认为jdk.nashorn.api.scripting.ScriptObjectMirror可能更有能力,因为它必须setProto()更改原型对象。更多关于ScriptObjectMirror这里:https ://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes

于 2015-03-06T15:58:23.820 回答