这是一个演示我面临的问题的示例:
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编写代码来解决这个问题.