以下是一个演示,我所面临的问题的例子:===在犀牛返回false当两个引用应指向同一个对象
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编写代码。
我接受这个答案,因为Sundar在邮件列表中为此行为提供了一个很好的解释。 –