Java脚本引擎(nashorn&;rhino):如何堆叠作用域/绑定?

Java脚本引擎(nashorn&;rhino):如何堆叠作用域/绑定?,java,rhino,nashorn,scriptengine,javax.script,Java,Rhino,Nashorn,Scriptengine,Javax.script,我必须使用Rhino1.7R4及其org.mozilla.javascript包移植一个软件,以使用javax.script包及其脚本引擎(Rhino在Java6和7中,Nashorn在Java8中) 主要问题是堆栈作用域(绑定)。 使用Rhino罐,我会: Scriptable scope ... Scriptable newScope = javascriptContext.initStandardObjects(); newScope.setParentScope(scope); 所以

我必须使用Rhino1.7R4及其org.mozilla.javascript包移植一个软件,以使用javax.script包及其脚本引擎(Rhino在Java6和7中,Nashorn在Java8中)

主要问题是堆栈作用域(绑定)。 使用Rhino罐,我会:

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

  • 如果定义的变量没有var,则它是全局变量(根范围)
  • 如果变量是用var定义的,则它是局部变量(当前范围)
  • 如果访问或修改变量,引擎将在其当前作用域中查找、父级和父级。。。以及全球范围
这是JS的标准行为


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

我在JDK中找到的
javax.script.Bindings
实现都没有任何递归查找。我认为您唯一的选择是编写一个定制的
Bindings
实现,它可以返回到父
Bindings


编辑:仅在Nashorn下(抱歉,不是Rhino),我认为
jdk.Nashorn.api.scripting.ScriptionObjectMirror
可能更有能力,因为它有
setProto()
来更改原型对象。有关
ScriptObjectMirror
的详细信息,请参见:

API不够。不知道变量的赋值是全局的还是局部的(他的语句中有或没有“var”关键字)。