Java 脚本引擎(nashorn 和犀牛): how to stack scopes/bindings?

标签 java rhino nashorn scriptengine javax.script

我必须移植一个使用 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/

相关文章:

Java - Eclipse 中的多个包问题

java - Web 脚本中的 Alfresco 节点锁定

java - 如何为 jjs/Nashorn javascript 指定 CLASSPATH?

java - 为什么 Java 8 的 Nashorn 引擎在严格模式下调用 apply() 并直接传递参数对象时会抛出 java.lang.ClassCastException?

java - 处理超时的 FutureTask

java - PropertiesFactoryBean 与 @PropertySource

java - 如何知道Rhino 调试器中的脚本执行已完成?

javascript - 如何通过 rhino shell 命令行获取运行的 javascript 文件的路径

java - 使用 JVM Nashorn (Play Framework) 呈现 React.js 时出错。我得到 "null is not a function"

java - 使用 NetBeans 向 Java 框架高效添加多个按钮