【发布时间】:2015-12-21 22:55:37
【问题描述】:
这是一个演示我面临的问题的示例:
ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(
new String[] { "-strict" }
);
try {
engine.eval("function Foo(src) { this.src = src }; var e = { x: new Foo(\"what\") };");
ScriptContext c = new SimpleScriptContext();
c.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
c.getBindings(ScriptContext.ENGINE_SCOPE).putAll(engine.getBindings(ScriptContext.ENGINE_SCOPE));
System.out.println(engine.eval("var z = e.x; z === e.x;", c));
} catch(Exception e) {
throw new RuntimeException(e);
}
我知道在另一个上下文中实例化的对象被认为是“外来的”并最终被ScriptObjectMirror 实例包装。我假设这就是我在这里遇到问题的原因。我相信每当x 被取消引用时,都会创建一个新的ScriptObjectMirror 实例;这是唯一可以解释以下代码也返回false:
System.out.println(engine.eval("e.x === e.x;", c));
有没有办法解决这个问题?我正在寻找可以从 Java 中做的事情,以某种方式设置上下文/绑定,而不必在 JavaScript 中编写代码来解决这个问题。
【问题讨论】:
标签: javascript java nashorn