Javascript 如何在Nashorn编译脚本中调用方法?
我有以下有效的代码:Javascript 如何在Nashorn编译脚本中调用方法?,javascript,java,nashorn,scriptengine,Javascript,Java,Nashorn,Scriptengine,我有以下有效的代码: ScriptEngine jsEngine = ScriptEngineManager.new().getEngineByName("nashorn"); jsEngine.eval("some script"); jsEngine.invokeMethod(jsEngine.eval("foo"), "bar"); 但是我想使用一个预编译的脚本,这样我就不必在每次需要运行它时都对脚本求值,所以我正在尝试 ScriptEngine jsEngine = ScriptEn
ScriptEngine jsEngine = ScriptEngineManager.new().getEngineByName("nashorn");
jsEngine.eval("some script");
jsEngine.invokeMethod(jsEngine.eval("foo"), "bar");
但是我想使用一个预编译的脚本,这样我就不必在每次需要运行它时都对脚本求值,所以我正在尝试
ScriptEngine jsEngine = ScriptEngineManager.new().getEngineByName("nashorn");
CompiledScript compiledJS = jsEngine.compile("some script");
但我不知道如何处理CompiledScript,如何调用方法?它只实现eval()显然:调用该方法吗
以下是几个例子:
例如:
import java.util.*;
import javax.script.*;
public class TestBindings {
public static void main(String args[]) throws Exception {
String script = "function doSomething() {var d = date}";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
Compilable compilingEngine = (Compilable) engine;
CompiledScript cscript = compilingEngine.compile(script);
//Bindings bindings = cscript.getEngine().createBindings();
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
for(Map.Entry me : bindings.entrySet()) {
System.out.printf("%s: %s\n",me.getKey(),String.valueOf(me.getValue()));
}
bindings.put("date", new Date());
//cscript.eval();
cscript.eval(bindings);
Invocable invocable = (Invocable) cscript.getEngine();
invocable.invokeFunction("doSomething");
}
}
你怎么称呼这个方法?CompiledScript没有实现Invocable。在您链接到的页面中没有提到invokeMethod或invokeFunction。我更新了示例,以前使用过类似的方法,但我可以说它有点不直观。我没有使用最新的脚本引擎,但我假设它以类似的方式工作?每次我想再次调用函数/方法时,是否需要创建新绑定?调用该方法会修改ScriptEngine本身吗?1)CompiledScript会消除一些开销,如果您反复运行它,那么速度会更快。调用可以发生在脚本内部,尤其是在递归函数的情况下。它不是一个不变性保证,而是一个常量——如果需要更改脚本,则需要重新编译+不,您也可以调用“cscript.eval();”,但是如果您想使用不同的可变参数,那么可以。每次重新编译都没有意义,因为它有更大的开销。3) 它将改变环境。如果您的意思是我认为我在这里的方法可能是错误的,那么您可以使用不同的绑定重用脚本引擎,因此我写了一个更基本的问题: