Анонимная функция в Нашорне

Допустим, есть файл, как это

(function () {
    function change() {
        print('test');
    }
    function test() {
        return 'Testing';
    }
})();

Как передать аргумент этой функции с помощью nashorn? Я не хочу запускать его через терминал, я должен создать метод, который принимает String в качестве аргумента и обрабатывать его с помощью кода js.

1 ответ

Решение

Ваш скрипт выше определяет анонимную функцию и вызывает ее немедленно! Если вы "оцените", вы получите результат этой функции. Если вы хотите определить анонимную функцию и вызвать ее из кода 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
Другие вопросы по тегам