Javascript Nashorn中的匿名函数
假设你有这样的文件Javascript Nashorn中的匿名函数,javascript,java,nashorn,Javascript,Java,Nashorn,假设你有这样的文件 (function () { function change() { print('test'); } function test() { return 'Testing'; } })(); 如何使用nashorn将参数传递给此函数?我不想通过终端运行它,我必须创建以字符串为参数的方法,并用js代码处理它 上面的脚本定义了一个匿名函数并立即调用它!如果你“评估”,你会得到这个函数的结果。如果您想定义一个匿名函数
(function () {
function change() {
print('test');
}
function test() {
return 'Testing';
}
})();
如何使用nashorn将参数传递给此函数?我不想通过终端运行它,我必须创建以字符串为参数的方法,并用js代码处理它 上面的脚本定义了一个匿名函数并立即调用它!如果你“评估”,你会得到这个函数的结果。如果您想定义一个匿名函数并从java代码中调用它,可以编写如下代码:
import javax.script.*;
import jdk.nashorn.api.scripting.*;
public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");
// define an anoymous function
JSObject multiply = (JSObject) e.eval("function(x, y) { return x*y; }");
// call that anon function
System.out.println(multiply.call(null, 34, 5));
// define another anon function
JSObject greet = (JSObject) e.eval("function(n) { print('Hello ' + n)}");
greet.call(null, "nashorn");
}
}
上面的脚本定义了一个匿名函数并立即调用它!如果你“评估”,你会得到这个函数的结果。如果您想定义一个匿名函数并从java代码中调用它,可以编写如下代码:
import javax.script.*;
import jdk.nashorn.api.scripting.*;
public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");
// define an anoymous function
JSObject multiply = (JSObject) e.eval("function(x, y) { return x*y; }");
// call that anon function
System.out.println(multiply.call(null, 34, 5));
// define another anon function
JSObject greet = (JSObject) e.eval("function(n) { print('Hello ' + n)}");
greet.call(null, "nashorn");
}
}
我可以通过以下方式解决这个问题:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
String task = "function(a, b) { return a + b; }";
engine.eval("var task = " + task);
Double result = (Double) ((Invocable) engine).invokeFunction("task", 10, 4);
System.out.println(result); // Output: 14.0
我可以通过以下方式解决这个问题:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
String task = "function(a, b) { return a + b; }";
engine.eval("var task = " + task);
Double result = (Double) ((Invocable) engine).invokeFunction("task", 10, 4);
System.out.println(result); // Output: 14.0
这是不可能的,我已经试过了。nashorn有什么特别的地方阻止你只传递最后一个括号中的参数吗?在快速搜索之后,我找不到任何可以阻止它的东西。算了吧,我明白了。不可能,我已经试过了。纳肖恩有什么特别的地方可以阻止你传递最后一个括号中的参数吗?在快速谷歌搜索之后,我找不到任何可以阻止它的东西。算了吧,我明白了。