【问题标题】:Jdk nashorn api ScriptEngine returning undefinedJdk nashorn api ScriptEngine 返回未定义
【发布时间】:2018-01-29 07:03:24
【问题描述】:

我正在尝试使用 jdk nashorn 脚本引擎运行一个简单的 javascript 函数。在那里,我将传递的变量之一返回给函数,只是为了简单地检查 nashorn api 是否工作正常。在脚本引擎运行该函数后,我得到未定义的结果。

    import jdk.nashorn.api.scripting.ScriptObjectMirror;
    import javax.script.ScriptException;
    import javax.script.Bindings;
    import javax.script.ScriptEngine;
    import jdk.nashorn.api.scripting.NashornScriptEngineFactory;

    public class JDKNashornScriptRunner {

    protected static final ScriptEngine scriptEngine = new NashornScriptEngineFactory().getScriptEngine();
    protected final Bindings bindings;

    public JDKNashornScriptRunner(String script)
    {
        bindings = scriptEngine.createBindings();
        try
        {
            scriptEngine.eval(script, bindings);
        }
        catch( ScriptException e )
        {
            throw new RuntimeException("Exception while compiling script", e);
        }
    }

    public Object runScript( String v1, String v2, String v3, String v4)
            throws NoSuchMethodException, ScriptException
    {
        bindings.clear();
        bindings.put("v1", v1);
        bindings.put("v2", v2);
        bindings.put("v3", v3);
        bindings.put("v4", v4);

        return ((ScriptObjectMirror) bindings.get("myFunction")).call(null);
    }
  }

这里是主程序-

public class RunMyFunctionScript {
    public static void main(String args[])
    {
        String runScript = "function myFunction(v1, v2, v3, v4) {return v3;}";
        JDKNashornScriptRunner scriptRunner = new JDKNashornScriptRunner(runScript);
        Object result = scriptRunner.runScript("a","b","c","d"); //Here I am getting undefined as value
        String v3Value = String.valueOf(result);
        System.out.println(v3Value);
    }
}

所以这里的问题是当 scriptEngine 尝试使用下面给定的行运行脚本时,我得到了未定义(它应该给我 c 作为值)

((ScriptObjectMirror) bindings.get("myFunction")).call(null);

【问题讨论】:

  • 请出示你的js方法。
  • 1) 执行bindings.clear() 后,您认为bindings.get("myFunction") 的价值是多少? --- 2) 你认为call(Object thiz, Object... args)方法中的args参数是干什么用的?

标签: javascript java nashorn


【解决方案1】:

因为您没有向 JavaScript 函数传递任何参数。 runScript 应该是:

public Object runScript( String v1, String v2, String v3, String v4)
        throws NoSuchMethodException, ScriptException
{
    return ((JSObject) bindings.get("myFunction")).call(null, v1, v2, v3, v4);
}

【讨论】:

猜你喜欢
  • 2019-01-13
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2021-12-15
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多