Подтвердить что ты не робот

JavaScript (Rhino) использует библиотеку или включает другие скрипты

В JDK6 существует ли способ загрузить несколько сценариев, каждый в файл, и иметь ссылку script метод другого script? Например, "включить"?

4b9b3361

Ответ 1

Я думаю, что вы после load() метод/свойство глобального объекта/области Rhino

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

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

Это загрузит исходный файл javascript, аналогичный тому, как include/require будет в PHP. После загрузки файла вы сможете вызвать и использовать или использовать любой объект, определенный в загруженном файле.

Вот как это работает, когда вы используете оболочку Rhino, которая является единственным контекстом, который я знаю (на ваш вопрос упоминался Java SDK, который находится за пределами моего опыта)

Ответ 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

Настоящий пример на этот раз, т.е. запуск esprima парсер с Rhino 1.7R4.

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.

Ответ 4

Пока вы используете одну и ту же область для выполнения каждого файла, они смогут ссылаться на функции и переменные из ранее выполненных файлов.