来自Java的自定义JavaScript函数:不';你不能在明确的上下文中工作吗? 准备工作

来自Java的自定义JavaScript函数:不';你不能在明确的上下文中工作吗? 准备工作,java,javascript,Java,Javascript,我能够从java调用或计算javascript表达式,如下所示: jsEngine.eval("ComputerName == 'mymachine'", myScriptContext); jsEngine.eval("_js_having_myfunction_and_expression_"); // note - no myScriptContext 属性值ComputerName从myScriptContext对象读取 脚本 现在的问题是,我想要一些自定义函数,它们可以是计算表达式

我能够从java调用或计算javascript表达式,如下所示:

jsEngine.eval("ComputerName == 'mymachine'", myScriptContext);
jsEngine.eval("_js_having_myfunction_and_expression_"); // note - no myScriptContext
属性值ComputerName从myScriptContext对象读取

脚本 现在的问题是,我想要一些自定义函数,它们可以是计算表达式的一部分,如:

jsEngine.eval("startswith(ComputerName, 'my')", myScriptContext);
由于startswith不是一个可用的函数(我必须支持带有该签名的startswith),因此我尝试编写一个.js文件,在该文件中定义了我的自定义函数并将要计算的表达式附加到该脚本中,并按如下方式执行:

jsEngine.eval("ComputerName == 'mymachine'", myScriptContext);
jsEngine.eval("_js_having_myfunction_and_expression_"); // note - no myScriptContext
问题
startswith
仅当我不呈现myScriptContext时才会被JS引擎识别。在我展示myScriptContet的那一刻,我得到了一个例外:

线程“main”中出现异常:

javax.script.ScriptException:sun.org.mozilla.javascript.internal.EcmaError:TypeError:startswith不是函数


也许您可以尝试执行
jsEngine.eval(“startswith=function(x,y){…};”
,以便在您尝试调用函数之前在JS执行上下文中手动定义该函数?我猜测您使用的是Rhino。。。对吗?如果是这样,您要在哪里运行此Javascript-即在浏览器、Web服务器或桌面应用程序中?这是作为服务器端业务逻辑执行的。@如果在没有任何脚本上下文的情况下进行连续eval()调用,这将起作用。我也试过了&发现,当第二次调用eval()时给出ScriptContext时,它将在不同的上下文中运行,并且不理解为第一次调用eval()传递的自定义函数。我最初评估我的自定义函数:javaScriptEngine.eval(“函数startswith(str,substr){\r\n“+”返回str.indexOf(substr)==0;\r\n“+”};”;然后是以下2个eval()的work://WORKS System.out.println(javaScriptEngine.eval(“startswith('abcd','ab');)));//WORKS javaScriptEngine.put(“key”,“blue”);System.out.println(javaScriptEngine.eval(“startswith(key,'bl'))”);