【问题标题】:Anonymous function in NashornNashorn 中的匿名函数
【发布时间】:2016-03-09 19:51:33
【问题描述】:

假设有这样的文件

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

如何使用 nashorn 将参数传递给这个函数?我不想通过终端运行它,我必须创建以 String 作为参数的方法并使用 js 代码处理它。

【问题讨论】:

  • 不可能,我试过了。
  • nashorn 有什么特别之处可以阻止你只传递最后一个括号中的参数吗?快速谷歌搜索后,我找不到任何可以阻止它的东西。
  • 算了,我明白了。

标签: javascript java nashorn


【解决方案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");
   }
}

【讨论】:

    【解决方案2】:

    我能够通过以下方式解决这个问题:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 2011-12-29
      • 2014-11-11
      • 2012-08-12
      相关资源
      最近更新 更多