JavaScript (Rhino) 使用库或包含其他脚本
Posted
技术标签:
【中文标题】JavaScript (Rhino) 使用库或包含其他脚本【英文标题】:JavaScript (Rhino) use library or include other scripts 【发布时间】:2010-10-13 14:48:51 【问题描述】:在 JDK6 中,有没有办法加载多个脚本,每个脚本都在一个文件中,并让一个脚本引用另一个脚本的方法?有点像“包含”?
【问题讨论】:
【参考方案1】:这次是一个真实的例子,即使用 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, "<mem>", 1, null);
Context.exit();
运行此代码后,您应该会看到如下输出:
"type": "Program",
"body": [
"type": "ExpressionStatement",
"expression":
"type": "Literal",
"value": 42,
"raw": "42"
]
确实,诀窍在于重用globalScope
对象。
【讨论】:
【参考方案2】:如果您碰巧尝试在 ant 中执行此操作,您可能会看到以下错误:
<script language="javascript">
load('foo.js');
</script>
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function load.
但你可以回避它:
<script language="javascript">
eval(''+new String(org.apache.tools.ant.util.FileUtils.readFully(new java.io.FileReader('foo.js'))));
</script>
【讨论】:
>>''+ 【参考方案3】:我认为你在寻找 Rhino 的全局对象/范围的 load() method/property
load("file1.js");
load("file2.js");
load("file3.js");
methodFromFileOne();
var bar = methodFromFileTwo();
var etc = dotDotDot();
这将加载一个 javascript 源文件,类似于 php 中的 include/require 方式。加载文件后,您将能够调用和运行或使用加载文件中定义的任何对象。
这就是您使用 Rhino shell 时的工作方式,这是我知道的唯一上下文(您的问题提到了 Java SDK,这超出了我的经验范围)
【讨论】:
这在 Rhino shell 之外可用吗? 不确定,这不是我的工资标准。 (更新了问题以反映这一点)【参考方案4】:只要您使用相同的作用域来执行每个文件,它们就可以从之前执行的文件中引用函数和变量。
【讨论】:
以上是关于JavaScript (Rhino) 使用库或包含其他脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Rhino 实现用于远程 javascript 调试的 intelliJ IDEA 插件?
用 Rhino 解释 Java 中的 JavaScript:暂停/恢复脚本
使用 Rhino 代替 ScriptEngine 在 Java 中运行 Javascript 代码
使用 ScriptManager (Rhino) 从 Java 中使用 Javascript HTML5 类型数组,如何?