web-dev-qa-db-ja.com

JavaScript(Rhino)はライブラリを使用するか、他のスクリプトを含めます

JDK6では、複数のスクリプトをそれぞれファイルにロードし、1つのスクリプトで別のスクリプトのメソッドを参照する方法はありますか? 「インクルード」のようなものですか?

26
Ayman

Rhinoのグローバルオブジェクト/スコープの load()メソッド/プロパティ の後だと思います

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

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

これにより、PHPでのinclude/requireと同様に、javascriptソースファイルが読み込まれます。ファイルをロードすると、ロードされたファイルで定義されている任意のオブジェクトを呼び出して機能させたり、使用したりできるようになります。

これは、私が知っている唯一のコンテキストであるRhino Shellを使用している場合の動作です(あなたの質問では、Java SDK、私の経験範囲外です)

28
Alan Storm

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>
10
Chris Plock

今回の実際の例、つまり、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オブジェクトを再利用することです。

10
Daniel Pacak

同じスコープを使用して各ファイルを実行する限り、以前に実行されたファイルから関数と変数を参照できます。

6
Matthew Crumley