Javascript 我可以使用Nashorn在新引擎范围内调用函数吗?

Javascript 我可以使用Nashorn在新引擎范围内调用函数吗?,javascript,multithreading,java-8,nashorn,Javascript,Multithreading,Java 8,Nashorn,Nashorn允许我在新范围内评估JavaScript,如下所示: public Object evalInNewScope(String code, Bindings bindings) throws Exception { ScriptContext context = new SimpleScriptContext(); context.setBindings(bindings, ScriptContext.ENGINE_SCOPE); return engine

Nashorn允许我在新范围内评估JavaScript,如下所示:

public Object evalInNewScope(String code, Bindings bindings) throws Exception  {
    ScriptContext context = new SimpleScriptContext();
    context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
    return engine.eval(code, context);
}
这对于线程安全非常重要:引擎实例可以跨线程重用,每个线程都可以使用特定于线程的绑定进行自己的调用

但是,我还没有发现类似的
Invocable#invokeFunction(字符串、对象…)
功能


有人知道我怎么能做我想做的吗?这种不对称现象有很好的原因吗?

invokeFunction
仅从当前上下文调用函数,不能直接提供上下文

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

ScriptContext ctx = new SimpleScriptContext();
ctx.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
engine.eval("function hello() { return 'Hello!'; }", ctx);
engine.setContext(ctx);

((Invocable) engine).invokeFunction("hello");
删除
engine.setContext(ctx)
行将导致
java.lang.NoSuchMethodException:没有这样的函数hello
异常


根据您的情况,您可能需要重新设置原始上下文

ENGINE\u范围
不是默认值吗?示例8中提到了这一点:默认脚本上下文至少有一个由静态字段ENGINE_scope表示的作用域。可能我不清楚:我想更改函数调用的引擎作用域绑定,类似于我可以使用eval()执行的操作。