JavaScript (Rhino) использует библиотеку или включает другие скрипты - PullRequest
26 голосов
/ 16 марта 2009

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

Ответы [ 4 ]

28 голосов
/ 16 марта 2009

Я думаю, что вы используете метод / свойство 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, который находится за пределами моей области опыта)

10 голосов
/ 29 апреля 2013

Реальный пример на этот раз, т.е. запуск парсера 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.

10 голосов
/ 19 августа 2011

если вы пытаетесь сделать это в муравье, вы можете увидеть эту ошибку:

<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>
6 голосов
/ 16 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...