28

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

4

4 に答える 4

30

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

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

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

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

これは、私が知っている唯一のコンテキストであるRhinoシェルを使用しているときに物事がどのように機能するかです(あなたの質問は私の経験の範囲外であるJava SDKに言及しました)

于 2009-03-16T18:31:55.937 に答える
10

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>
于 2011-08-19T18:28:01.683 に答える
10

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

于 2013-04-29T13:24:46.310 に答える
6

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

于 2009-03-16T15:14:49.640 に答える