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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/650377/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 17:23:39  来源:igfitidea点击:

JavaScript (Rhino) use library or include other scripts

javajavascriptrhino

提问by Ayman

In JDK6, is there a way to load multiple scripts, each in a file, and have the one script reference a method of another script? Sort of like "include"?

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

采纳答案by Alan Storm

I think you're after the load() method/propertyof Rhino's global object/scope

我认为您在使用Rhino 全局对象/范围的load() 方法/属性

load("file1.js");
load("file2.js");
load("file3.js");

methodFromFileOne();
var bar = methodFromFileTwo();
var etc = dotDotDot();

This will load a javascript source file, similar to how include/require will in PHP. Once you load a file, you'll be able to call and function or use any object defined in the loaded file.

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

This is how things work when you're using the Rhino shell, which is the only context I know (your question mentioned the Java SDK, which is outside my area of experience)

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

回答by Matthew Crumley

As long as you use the same scope to execute each file, they will be able to reference functions and variables from previously executed files.

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

回答by Chris Plock

if you happen to be trying to do this within ant, you might see this error:

如果您碰巧尝试在 ant 中执行此操作,您可能会看到以下错误:

<script language="javascript">
    load('foo.js');
</script>
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function load.

but you can sidestep it:

但你可以回避它:

<script language="javascript">
    eval(''+new String(org.apache.tools.ant.util.FileUtils.readFully(new java.io.FileReader('foo.js'))));
</script>

回答by Daniel Pacak

A real-life example this time, i.e. running the esprimaparser with Rhino 1.7R4.

这次是一个真实的例子,即使用 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();

After running this code, you should see the output as follows:

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

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

So indeed, the trick is in reusing the globalScopeobject.

所以确实,诀窍在于重用globalScope对象。