2009-03-16 9 views

Respuesta

26

Creo que estás después de la load() method/property del objeto global de Rhino/alcance

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á voluntad 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 se está utilizando el shell de Rhino, que es el único contexto que conozco (tu pregunta menciona el SDK de Java, que está fuera de mi área de experiencia)

+0

¿Está disponible fuera de la carcasa de Rhino? – Thilo

+0

No estoy seguro, esa no es mi tasa de pago. (actualizó la pregunta para reflejar que) –

6

Siempre que utilice el mismo alcance para ejecutar cada archivo, podrán hacer referencia a funciones y variables de archivos ejecutados previamente.

+0

Ayuda grande, gracias –

10

si le toca estar tratando de hacer esto dentro de hormiga, es posible que vea este error:

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

pero se puede dejar de lado que:

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

¡El >> '' + << es de gran importancia aquí! –

9

Un ejemplo real de este tiempo, es decir, que ejecuta elAnalizadorcon 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" 
     } 
    } 
    ] 
} 

Así que de hecho, el truco consiste en reutilizar el objeto globalScope.