tutorial java javascript rhino

tutorial - JavaScript(Rhino) usa la biblioteca o incluye otros scripts



rhino javascript tutorial (4)

Creo que estás buscando el método / propiedad load () del objeto / alcance global de Rhino

load("file1.js"); load("file2.js"); load("file3.js"); methodFromFileOne(); var bar = methodFromFileTwo(); var etc = dotDotDot();

Esto cargará un archivo fuente de javascript, similar a cómo incluir / requerir será en PHP. Una vez que cargue un archivo, podrá llamar y funcionar o usar cualquier objeto definido en el archivo cargado.

Así es como funcionan las cosas cuando está utilizando el shell de Rhino, que es el único contexto que conozco (su pregunta menciona el SDK de Java, que está fuera de mi área de experiencia)

En JDK6, ¿hay una manera de cargar varios scripts, cada uno en un archivo, y hacer que un script haga referencia a un método de otro script? Algo así como "incluir"?


Mientras use el mismo ámbito para ejecutar cada archivo, podrán hacer referencia a funciones y variables de archivos ejecutados anteriormente.


Si está intentando hacer esto dentro de ant, puede ver este error:

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

pero puedes evitarlo:

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


Un ejemplo de la vida real esta vez, es decir, ejecutar el analizador de esprima con 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();

Después de ejecutar este código, debería ver la salida de la siguiente manera:

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

De hecho, el truco está en reutilizar el objeto globalScope .