我必须移植一个使用 Rhino1.7R4 及其 org.mozilla.javascript 包的软件才能使用 javax.script 包和它的 ScriptEngine(Java 6 和 7 中的 Rhino,Java 8 中的 Nashorn)。
主要问题是堆栈范围(绑定(bind))。 使用 Rhino jar,我可以:
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.ScriptObjectMirror
可能更有能力,因为它有 setProto()
更改原型(prototype)对象。更多关于 ScriptObjectMirror
的信息:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes
关于Java 脚本引擎(nashorn 和犀牛): how to stack scopes/bindings?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28212121/