Java 11 中的 Nashorn 在评估命名函数时的行为与 Java 8 不同
我有一个Java应用程序,它允许用户通过定义JavaScript函数在运行时操作某些对象。我们目前正在Java 8中使用Nashorn来做这件事,但我们希望迁移到Java 11。一旦我们上了Java 11,我们将能够在GraalVM中提供此功能,但现在我们需要保持Java 8 ->Nashorn脚本的Java 11升级的兼容性。
在Java 11中,当我们评估函数时,Nashorn的行为似乎有所不同,这取决于该函数是否被命名,而Java 8中的情况并非如此。下面是在 Java 11 中使用 JJS 的示例:
$ jjs -v
nashorn 11.0.6
Warning: The jjs tool is planned to be removed from a future JDK release
jjs> function foo() {}
jjs> function () {}
function () {}
请注意,第一个函数定义不返回任何内容。在 Java 8 中,即使函数被命名为,它也会返回该函数:
$ jjs -v
nashorn 1.8.0_252
jjs> function foo() {}
function foo() {}
我们目前调用这些脚本的方式是:
CompiledScript compiled = scriptEngine.compile(userProvidedScript);
Object evaled = compiled.eval(bindings);
scriptEngine.invokeMethod(evaled, "call", evaled, ... input parameters ...)
好奇是否有人知道这种情况的根本原因以及任何好的解决方法?我需要支持以及出于反向兼容的原因。由于这是在我们的Java应用程序中完成的,因此我们可能会以某种方式包装用户提供的脚本,或者尝试从绑定中获取脚本(这似乎容易出错,因为可以定义多个脚本,并且Java 8行为将是调用最后定义的脚本)。function(...)
function foo(...)