如何确定哪个javascript引擎,rhino或nashorn正在运行我的代码?

时间:2016-06-09 06:46:53

标签: javascript rhino nashorn javascript-engine

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

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

2 个答案:

答案 0 :(得分:1)

查看Rhino to Nashorn migration guide,我看到了几种可能的方法。

如果您没有使用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;
}

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

答案 1 :(得分:1)

使用--no-java选项," Java"在Nashorn中未定义为对象。最好是检查Nashorn中总是可用的东西。像 DIR FILE 变量这样的东西是个不错的选择。永远在纳索恩。

JJS> typeof 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,您可以看到#Naeorn" Oracle Nashorn"作为引擎名称。