6

如何确定浏览器中的javascript引擎有几个问题。我必须编写必须在 rhino 和 nashorn 上运行的 javascript 代码。

如何确定我的代码是在 rhino 还是 nashorn 上运行?是否有可以确定引擎的典型函数、变量、常量?

4

2 回答 2

2

查看Rhino 到 Nashorn 迁移指南,我看到了几种可能的方法。

如果您不使用 Rhino 兼容性脚本,可以这样做:

var usingNashorn = typeof importClass !== "function";

...因为importClass是为 Rhino 定义的,但不是为 Nashorn 定义的(除非您包含兼容性脚本)。

认为 Java.type是 Nashorn 特有的,所以:

var usingNashorn = typeof Java !== "undefined" && Java && typeof Java.type === "function";

您可以检查异常的包装:

var usingNashorn;
try {
    // Anything that will throw an NPE from the Java layer
    java.lang.System.loadLibrary(null);
} catch (e) {
    // false!
    usingNashorn = e instanceof java.lang.NullPointerException;
}

...因为迁移指南说这将true适用于 Nashorn,但false适用于 Rhino。它确实涉及抛出异常,这是不幸的。

于 2016-06-09T07:01:03.943 回答
1

使用 --no-java 选项,“Java”未定义为 Nashorn 中的对象。最好的办法是检查 Nashorn 中始终可用的东西。像DIRFILE变量这样的东西是一个很好的选择。总是在那里。

jjs>类型DIR

细绳

如果您使用的是 javax.script API(而不是 jjs),您可以获取引擎名称并进行检查:

import javax.script.*;

public class Main {
   public static void main(String[] args) throws Exception {
     ScriptEngineManager m = new ScriptEngineManager();
     ScriptEngine e = m.getEngineByName("nashorn");
     System.out.println(e.getFactory().getEngineName());
   }
}

使用 Nashorn,您会看到“Oracle Nashorn”作为引擎名称。

于 2016-06-10T04:17:46.547 回答