Function object cannot be called with different context
Frantzius, Jörg
Joerg.Frantzius at aperto.com
Mon Jan 30 10:28:14 UTC 2017
Hi,
in my code, I get hold of a function object from some 3rd party Javascript code, and I need to execute that function within a new context, i.e. make new ENGINE_SCOPE bindings available to it. ScriptObjectMirror.call() unfortunately does not allow to define a context to execute in, so I tried to workaround by calling the function from a CompiledScript that in turn can be executed with a custom context:
@Test
public void testJsFunctionWithContext() throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
jdk.nashorn.api.scripting.ScriptObjectMirror jsFunction = (ScriptObjectMirror) engine.eval("function test() {return foo;}");
ScriptContext context = new SimpleScriptContext();
context.setAttribute("foo", "bar", ScriptContext.ENGINE_SCOPE);
context.setAttribute("fn", jsFunction, ScriptContext.ENGINE_SCOPE);
// does work: access context directly
CompiledScript contextWrapper = ((Compilable) engine).compile("foo");
String result = (String) contextWrapper.eval(context);
assertEquals("bar", result);
// does not work: access context from within function ("foo" is not defined)
contextWrapper = ((Compilable) engine).compile("fn()");
result = (String) contextWrapper.eval(context);
assertEquals("bar", result);
}
Is there some mistake I made here, or is it simply not possible for a function object to access variables from a new context?
If that’s really not possible, is there maybe a way of turning a function object into a CompiledScript object, which can then be evaluated with a new context?
Thanks for any help,
Jörg
---
Dipl. Inf. Jörg von Frantzius, Technical Director
E-Mail joerg.frantzius at aperto.com
Phone +49 30 283921-318
Fax +49 30 283921-29
Aperto GmbH – An IBM Company
Chausseestraße 5, D-10115 Berlin
http://www.aperto.com<http://www.aperto.de/>
http://www.facebook.com/aperto
https://www.xing.com/companies/apertoag
HRB 77049 B, AG Berlin Charlottenburg
Geschäftsführer: Dirk Buddensiek, Kai Großmann, Stephan Haagen, Daniel Simon
More information about the nashorn-dev
mailing list