JavaScript(Rhino)使用库或包含其他脚本

在JDK6中,有没有办法加载多个脚本,每个脚本都在一个文件中,并让一个脚本引用另一个脚本的方法? 有点像“包括”?

我想你是在Rhino的全局对象/范围的load()方法/属性之后

load("file1.js"); load("file2.js"); load("file3.js"); methodFromFileOne(); var bar = methodFromFileTwo(); var etc = dotDotDot(); 

这将加载一个javascript源文件,类似于PHP中的include / require方式。 加载文件后,您将能够调用并运行或使用加载文件中定义的任何对象。

这是你使用Rhino shell时的工作方式,这是我所知道的唯一上下文(你的问题提到了Java SDK,这超出了我的经验范围)

如果你碰巧在ant中尝试这样做,你可能会看到这个错误:

  javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function load. 

但你可以回避它:

  

这次是一个真实的例子,即使用Rhino 1.7R4运行esprima解析器。

 import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; ... Context context = Context.enter(); Scriptable globalScope = context.initStandardObjects(); Reader esprimaLibReader = new InputStreamReader(getClass().getResourceAsStream("/esprima.js")); context.evaluateReader(globalScope, esprimaLibReader, "esprima.js", 1, null); // Add a global variable out that is a JavaScript reflection of the System.out variable: Object wrappedOut = Context.javaToJS(System.out, globalScope); ScriptableObject.putProperty(globalScope, "out", wrappedOut); String code = "var syntax = esprima.parse('42');" + "out.print(JSON.stringify(syntax, null, 2));"; // The module esprima is available as a global object due to the same // scope object passed for evaluation: context.evaluateString(globalScope, code, "", 1, null); Context.exit(); 

运行此代码后,您应该看到输出如下:

 { "type": "Program", "body": [ { "type": "ExpressionStatement", "expression": { "type": "Literal", "value": 42, "raw": "42" } } ] } 

事实上,诀窍在于重用globalScope对象。

只要您使用相同的范围来执行每个文件,它们就能够从以前执行的文件中引用函数和变量。